我的程序 - 除其他外 - 改变了控制台窗口的外观(主要是窗口大小和边框) 现在在我的计算机上,此刻一切正常,但是当我在 VirtualBox 或不同的计算机上运行应用程序时,我得到以下内容:
图像左上角的窗口实际上不是窗口。它是一个窗口的图像,您无法点击。 (点击鼠标点击它)
你可以通过拉伸桌面上的选择矩形来消除它,或者如果你突出显示(例如)它下面的按钮。此外,您可以在其上移动一个窗口,使其完全消失。
图像右下角的黑色矩形是我的控制台窗口,可以正确显示。
我的问题是,如何摆脱鬼魂'用C ++编写的窗口?
我尝试了谷歌搜索,但我能找到的只是ChangeDisplaySettings(0, 0);
,这在我的电脑上没有做任何事情(可能是因为我甚至没有在我的电脑上出现这个问题),而且在VirtualBox中,它首先似乎暂时使控制台窗口全屏,然后回到它的方式。 (第一次运行应用程序时屏幕闪烁)
虽然它确实删除了鬼窗口,但我不希望屏幕像这样闪烁,所以这不是我想要的。
编辑:
由于我无法弄清楚这个问题的相关代码是什么,所以我只会转储与我的程序中更改窗口本身有关的所有代码。
CSBIEx.cbSize = sizeof(CONSOLE_SCREEN_BUFFER_INFOEX);
GetConsoleScreenBufferInfoEx(hCon, &CSBIEx);
CSBIEx.dwSize.X = 49;
CSBIEx.dwSize.Y = 21;
SetConsoleScreenBufferInfoEx(hCon, &CSBIEx);
srWnd.Bottom = 20;
srWnd.Left = 0;
srWnd.Right = 48;
srWnd.Top = 0;
SetConsoleWindowInfo(hCon, TRUE, &srWnd);
GetClientRect(hWnd, &rClnt);
rClnt.top += 1;
rClnt.bottom -= 2;
rClnt.right -= 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) - rClnt.right / 2) - 1, (rScr.bottom / 2) - rClnt.bottom / 2, 0, 0, SWP_FRAMECHANGED | SWP_DRAWFRAME | SWP_NOSIZE);
SetWindowRgn(hWnd, CreateRectRgnIndirect(&rClnt), 1);
ShowWindow(hWnd, SW_SHOWNORMAL);
//ChangeDisplaySettings(0, 0);
2ND编辑:
我不知道它是否有任何帮助,但我注意到,如果我使用ChangeDisplaySettings(NULL, 0);
代替ChangeDisplaySettings(0, 0);
,它就不会做任何事情。考虑到NULL
是#define
d 0
,这很奇怪。
如果没有人可以解决任何问题,我可能最终会使用ChangeDisplaySettings(0, 0);
。
答案 0 :(得分:2)
InvalidateRect(NULL, NULL, TRUE);
是我要找的东西。
答案 1 :(得分:0)
您是否在计算机上运行“Aero”主题?如果是这样,请切换到经典主题。 Betcha你会看到问题表现出来。我认为你的应用程序没有正确处理WM_PAINT消息。 Aero主题发送的WM_PAINT消息少得多。操作系统使用它保存的位图进行绘画。
编辑:尝试使用新维度调用这些:
BOOL WINAPI SetConsoleDisplayMode(
_In_ HANDLE hConsoleOutput,
_In_ DWORD dwFlags,
_Out_opt_ PCOORD lpNewScreenBufferDimensions
);
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686033%28v=vs.85%29.aspx
BOOL WINAPI SetConsoleWindowInfo(
_In_ HANDLE hConsoleOutput,
_In_ BOOL bAbsolute,
_In_ const SMALL_RECT *lpConsoleWindow
);
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686125%28v=vs.85%29.aspx
您也可以尝试使用DispatchMessage向自己发送WM_PAINT消息。