我想在整个窗口上绘制一个应用程序。我为此使用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

希望这会有所帮助。最好的问候和好运!

08-18 15:19
查看更多