Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WinAPI:Can';我不能完全摆脱窗框_C++_Winapi_Window_Frame_Gdi+ - Fatal编程技术网

C++ WinAPI:Can';我不能完全摆脱窗框

C++ WinAPI:Can';我不能完全摆脱窗框,c++,winapi,window,frame,gdi+,C++,Winapi,Window,Frame,Gdi+,我想做一个在整个窗户上画画的应用程序。为此,我使用GDI+。因为我不需要它有任何边框,所以我用SetWindowLong函数禁用了它,去掉了使它有边框的任何样式,如下所示: SetWindowLong(hwnd, GWL_STYLE, 0); return 1L; // if in window procedure 只要我不想自己在窗户上画东西,它就行。我试着处理WM_PAINT消息,WM_ERASEBKGND消息,甚至WM_NCPAINT(虽然没什么作用),但出于某种原因,总是有一些剩余的

我想做一个在整个窗户上画画的应用程序。为此,我使用GDI+。因为我不需要它有任何边框,所以我用SetWindowLong函数禁用了它,去掉了使它有边框的任何样式,如下所示:

SetWindowLong(hwnd, GWL_STYLE, 0);
return 1L; // if in window procedure
只要我不想自己在窗户上画东西,它就行。我试着处理
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
。大概是这样的:

SetWindowLong(hwnd, GWL_STYLE, 0);
return 1L; // if in window procedure

我也不喜欢你删除边界的方式。试试看

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

如果所有这些都失败了,以下是一些可以帮助您的其他方法:


希望这能有所帮助。祝你好运

将窗口样式设置为
0
也会清除相当重要的样式,如
WS\u VISIBLE
。如果没有该样式集,Windows将不会尝试绘制您的窗口。如果您想消除边框的残余,则需要在创建窗口之前设置窗口样式。@Jonathan Potter:ShowWindow函数也可以工作。当然,我可以将此样式设置为我希望窗口具有的唯一样式,但这不是必需的。这些启动屏幕有点有趣,尽管我怀疑它们是否有用,因为我需要处理大量消息,我想知道我是否能够通过另一个窗口的过程轻松地处理它们。@PookyFan:我的理解是,您需要在
WM\u NCCALCSIZE
处理程序中
返回NULL
,以删除标题栏和标题@PookyFan:我刚试过,它很管用!只需从
WM\u NCCALCSIZE
返回
NULL
,窗口框架就被删除了!尽管如此,关闭窗口的唯一方法是通过
ALT
+
F4
但请注意,我的窗口具有
WS\u OVERLAPPEDWINDOW
样式。@PookyFan:要关闭窗口,您可以在窗口中添加一个按钮,然后使用
destronWindow
,它会工作的(我刚刚尝试过)。是的,谢谢,但我已经解决了我的问题。不过我还是很高兴你能帮我检查一下,我真的很感激。