[英]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
http://code.logos.com/blog/2008/09/displaying_a_splash_screen_with_c_introduction.html
希望这会有所帮助。 顺祝商祺!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.