gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:21 25 4
gpt4 key购买 nike

我想制作一个应用程序,我可以在整个窗口上绘画。为此,我使用 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 对象并将其与窗口句柄相关联是个好主意。但是由于某种原因,它看起来好像在需要时没有从关联的窗口中获取新的设备上下文(可能它只获取了一次,然后就不再理会它了)。所以每次我想在 window 上画东西时,我都会尝试创建一个新对象,但垃圾不见了!
无论如何,感谢所有发表评论并试图提供帮助的人,我真的很感激。

最佳答案

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

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

希望这对您有所帮助。致以最诚挚的问候,祝你好运!

关于c++ - WinAPI:无法完全摆脱窗口框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27031028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com