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

时间:2014-11-20 03:02:25

标签: 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对象并将其与窗口句柄相关联将是一个好主意。但由于某些原因,它看起来似乎没有从相关窗口获得新的设备上下文,当它需要时(可能它只获得它一次,然后不打扰它)。因此,每当我想在窗户上画一些东西并且垃圾消失时,我就尝试创建一个新物体!
无论如何,感谢所有评论并试图提供帮助的人,我真的很感激。

1 个答案:

答案 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

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

希望这会有所帮助。祝您好运!