4

我创建了一个程序,其中包括更改控制台窗口大小并从中删除窗口边框(主要是通过将窗口样式设置为 WS_POPUP)。
现在在我的计算机上,应用程序执行没有任何问题,但是当我在另一台计算机(或 VirtualBox)中运行代码时,我遇到了一些时髦的故障。

这是一张图片,显示了我所说的这些故障: 具有令人敬畏的景深的故障

如果用户在控制台窗口顶部移动/打开一个窗口,然后将控制台窗口再次带到顶部,这些故障就会出现。
所以很自然地,我认为摆脱这个问题的最简单方法是让控制台窗口始终位于顶部,但这并没有帮助,因为现在这些故障只是从新出现的任何东西中获取它们的“背景”窗口在控制台窗口的顶部(或更确切地说,在下面)移动/打开。
似乎故障区域以某种方式缓存/存储在某处,并且没有注意到窗口已调整大小。

GetClientRect(hWnd, &rClnt);
rClnt.top += 1;
rClnt.bottom -= 2;
rClnt.right -= 1;
SetWindowRgn(hWnd, CreateRectRgnIndirect(&rClnt), 1);
SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP);
exStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
exStyle &= ~WS_EX_CLIENTEDGE;
SetWindowLongPtr(hWnd, GWL_EXSTYLE, exStyle);
BringWindowToTop(hWnd);
SetWindowPos(hWnd, HWND_TOPMOST, ((rScr.right / 2) - rWnd.right / 2) - 1, (rScr.bottom / 2) - rWnd.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE);// After this I just use ShowWindow().
4

1 回答 1

0

我设法修复了这些故障。

我所做的SetWindowRgn()只是将函数移到了ShowWindow()(位于代码片段的最后)的上方。
这消除了故障区域,现在我的窗口可以正确显示。


之后出现窗口不居中的错误,但我通过更改修复了它

if(!SetWindowPos(hWnd, HWND_TOPMOST, ((rScr.right / 2) - rWnd.right / 2) - 1, (rScr.bottom / 2) - rWnd.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE))

if(!SetWindowPos(hWnd, HWND_TOPMOST, ((rScr.right / 2) - rClnt.right / 2) - 1, (rScr.bottom / 2) - rClnt.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE))
于 2012-11-27T13:03:28.713 回答