繁体   English   中英

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

[英]WinAPI: Can't completely get rid of window frame

我想在整个窗口上绘制一个应用程序。 我为此使用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对象并将其与窗口句柄相关联将是一个好主意。 但是由于某种原因,它看上去并没有在需要时从关联的窗口中获取新的设备上下文(适当的是,它只获取了一次,然后就再也不用担心了)。 因此,每当我想在窗户上画一些东西而垃圾都消失了时,我尝试创建一个新对象!
无论如何,感谢所有发表评论并尝试提供帮助的人,对此我深表感谢。

如果您自己处理背景画,则需要从WM_ERASEBKGND处理程序返回1 像这样:

return 1L; // if in window procedure

要么

return (INT_PTR)TRUE; // if in dialog box procedure

我也不喜欢您删除边框的方式。 试试这个吧

在我看来,您需要启动屏幕,但我还没有这样做。 仍然这篇MSDN文章可能正是您所需要的。

如果全部失败,这里还有一些可以帮助您的事项:

http://www.codeproject.com/Articles/15523/Own-thread-Win-splash-screen

http://www.codeproject.com/Articles/7658/CSplash-A-Splash-Window-Class

实现C ++ Win32启动画面的最快方法

http://code.logos.com/blog/2008/09/displaying_a_splash_screen_with_c_introduction.html

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

希望这会有所帮助。 顺祝商祺!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM