我想在整个窗口上绘制一个应用程序。我为此使用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
对象并将其与窗口句柄相关联将是一个好主意。但是由于某种原因,它看上去并没有在需要时从关联的窗口中获取新的设备上下文(适当的是,它只获取了一次,然后就再也不用担心了)。因此,每当我想在窗户上画一些东西而垃圾都消失了时,我尝试创建一个新对象!无论如何,感谢所有发表评论并尝试提供帮助的人,对此我深表感谢。
最佳答案
如果您自己处理背景画,则需要从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
http://www.codeguru.com/cpp/w-d/dislog/splashscreens/article.php/c5029/Adding-a-Splash-Screen-to-Your-Applications.htm
希望这会有所帮助。最好的问候和好运!