我想制作一个应用程序,我会在整个窗口上绘画。我为此目的使用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
对象并将其与窗口句柄相关联将是一个好主意。但由于某些原因,它看起来似乎没有从相关窗口获得新的设备上下文,当它需要时(可能它只获得它一次,然后不打扰它)。因此,每当我想在窗户上画一些东西并且垃圾消失时,我就尝试创建一个新物体!
无论如何,感谢所有评论并试图提供帮助的人,我真的很感激。
答案 0 :(得分:3)
如果您自己处理背景绘画,则需要从1
处理程序返回WM_ERASEBKGND
。像这样:
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
希望这会有所帮助。祝您好运!