c++ - WinAPI:无法完全摆脱窗口框架

标签 c++ winapi window frame gdi+

我想制作一个在整个窗口上绘画的应用程序。我使用 GDI+ 来达到这个目的。因为我不需要它有任何边框,所以我使用 SetWindowLong 函数禁用它,去掉任何使它有框架的样式,如下所示:

SetWindowLong(hwnd, GWL_STYLE, 0);

只要我不尝试自己在该窗口上实际绘制一些东西,它就可以正常工作。我尝试处理 WM_PAINT消息,WM_ERASEBKGND消息,甚至WM_NCPAINT (虽然它没有做太多事情),但由于某种原因,总是有一些剩余的边界,或者至少看起来像它。像这样的东西: My window

如您所见,有一个黑色矩形,其底部和右侧有某种框架。看起来边界没有完全画在这里,尽管根本不应该画。这里的图像只是一个空白的黑色位图,但对于普通图片来说问题也是一样的。对于我尝试处理的所有消息来说,它看起来并不相同,但结果几乎相同 - 它最终会绘制一些额外的垃圾,就好像无论如何它都厌倦了绘制该死的框架。

这就是我处理消息的方式:

case WM_ERASEBKGND:
{
    drawer->DrawImage(image, 0, 0, width, height);
    return 0;
}  
case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint( hwnd, & ps );
    drawer->DrawImage(image, 0, 0, width, height);
    EndPaint(hwnd, &ps);
    return 0;
}

一个drawer变量是指向 Gdiplus::Graphics 的指针类对象,image是指向 Gdiplus::Bitmap 的指针目的。我确实相信这些对象是有效的,因为从文件加载的正常图片可以正确显示(除了那个该死的框架)。

如果我启用启用绘图窗口框架的样式,效果很好,但我不想这样做。但我已经没有想法了,也不知道该怎么做。永远不要熬夜编写 win32 应用程序。

编辑:显然问题出在 drawer毕竟是变量。我认为创建一个 Gdiplus::Graphics对象一次并将其与窗口句柄关联将是一个好主意。但由于某种原因,看起来它在需要时没有从关联的窗口获取新的设备上下文(可能它只获取一次,然后就不再关心它)。因此,每次我想在 window 上画东西时,我都会尝试创建一个新对象,然后垃圾就消失了!
无论如何,感谢所有发表评论并试图提供帮助的人,我真的很感激。

最佳答案

如果您自己处理背景绘制,则需要从 WM_ERASEBKGND 处理程序返回 1。像这样的事情:

return 1L; // if in window procedure

return (INT_PTR)TRUE; // if in dialog box procedure

我也不喜欢你删除边框的方式。试试this相反。

在我看来,您需要启动屏幕,但我还没有这样做。仍然this MSDN article可能正是您所需要的。

如果全部失败,这里还有一些可以帮助您的内容:

http://www.codeproject.com/Articles/15523/Own-thread-Win-splash-screen

http://www.codeproject.com/Articles/7658/CSplash-A-Splash-Window-Class

Quickest way to implement a C++ Win32 Splash Screen

http://code.logos.com/blog/2008/09/displaying_a_splash_screen_with_c_introduction.html

http://www.codeguru.com/cpp/w-d/dislog/splashscreens/article.php/c5029/Adding-a-Splash-Screen-to-Your-Applications.htm

希望这有帮助。致以诚挚的问候,祝你好运!

关于c++ - WinAPI:无法完全摆脱窗口框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27031028/

相关文章:

javascript - 如何使用 WebKit 在 JavaScript 中调用 C++ 函数?

使用自定义类类型作为键的 C++ unordered_map

c++ - std::apply forward parameters 如何在没有显式 std::forward 的情况下应用?

c++ - 如何使用 CreateProcess 执行简单的命令行?

javascript - 如何播放系统媒体声音

wpf - Windows 8 Live Tile 图标背景颜色

c++ - 在 64 位中进行组合乘除运算的最准确方法是什么?

winapi - WS_VSCROLL,CreateWindow样式有效,SetWindowLong不起作用

javascript - 在文本区域中显示窗口的直接链接

window - 关闭 SDL 窗口而不退出 SDL