我想制作一个在整个窗口上绘画的应用程序。我使用 GDI+ 来达到这个目的。因为我不需要它有任何边框,所以我使用 SetWindowLong 函数禁用它,去掉任何使它有框架的样式,如下所示:
SetWindowLong(hwnd, GWL_STYLE, 0);
只要我不尝试自己在该窗口上实际绘制一些东西,它就可以正常工作。我尝试处理 WM_PAINT
消息,WM_ERASEBKGND
消息,甚至WM_NCPAINT
(虽然它没有做太多事情),但由于某种原因,总是有一些剩余的边界,或者至少看起来像它。像这样的东西:
如您所见,有一个黑色矩形,其底部和右侧有某种框架。看起来边界没有完全画在这里,尽管根本不应该画。这里的图像只是一个空白的黑色位图,但对于普通图片来说问题也是一样的。对于我尝试处理的所有消息来说,它看起来并不相同,但结果几乎相同 - 它最终会绘制一些额外的垃圾,就好像无论如何它都厌倦了绘制该死的框架。
这就是我处理消息的方式:
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
希望这有帮助。致以诚挚的问候,祝你好运!
关于c++ - WinAPI:无法完全摆脱窗口框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27031028/