C++ 无边界窗口覆盖任务栏
我有一个定制的无边框窗户。当最大化时,它会覆盖任务栏。这不是我想要的。我已经使用了C++ 无边界窗口覆盖任务栏,c++,windows,winapi,borderless,C++,Windows,Winapi,Borderless,我有一个定制的无边框窗户。当最大化时,它会覆盖任务栏。这不是我想要的。我已经使用了WM_GETMINMAXINFO消息。但是,我发现Windows10会在底部和右侧留出额外的8像素间隙。这是一个全有或全无的命题。以下是我尝试的第一个代码: case WM_GETMINMAXINFO: PMINMAXINFO pmm; pmm = (PMINMAXINFO)lParam; pmm->ptMaxSize.x = GetSystemMetrics(SM_CXSCRE
WM_GETMINMAXINFO
消息。但是,我发现Windows10会在底部和右侧留出额外的8像素间隙。这是一个全有或全无的命题。以下是我尝试的第一个代码:
case WM_GETMINMAXINFO:
PMINMAXINFO pmm;
pmm = (PMINMAXINFO)lParam;
pmm->ptMaxSize.x = GetSystemMetrics(SM_CXSCREEN);
pmm->ptMaxSize.y = GetSystemMetrics(SM_CYSCREEN);
return 0;
这样做的结果与我得到的结果相同,没有挂接WM_GETMINMAXINFO
消息。因此,我从底部去掉了两个像素,这样我就可以访问任务栏(处于“自动隐藏”模式):
突然,我在底部有一个10像素的间隙,在右侧有一个新的8像素间隙!这似乎是Windows 10的事情,因为Win7从未发生过这种情况。我还尝试了systemparameters info
,调用SPI\u GETWORKAREA
(而不是GetSystemMetrics()
),得到了相同的结果
据我所知,问题不在于WM_GETMINMAXINFO
。相反,我需要在代码中输入一个命令,以保持任务栏在顶部。我已经搜索了windows样式。但是,我没有找到任何帮助
“谁知道如何解决这个关键问题。”< P> > P>我在一个最不可能的地方找到了答案。有人试图用Python代码来操纵边界。在他们的尝试下,我能够设计出一个C++中无边界窗口的解决方案。 首先,我创建了一个带有
WS_OVERLAPPEDWINDOW | WS_VISIBLE
样式的窗口,以启用所有Windows功能。然后,我用以下代码处理WM_NCCALCSIZE
消息:
case WM_NCCALCSIZE:
{
WINDOWPLACEMENT wp;
LPNCCALCSIZE_PARAMS szr;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
szr = LPNCCALCSIZE_PARAMS(lParam);
if (wp.showCmd == SW_SHOWMAXIMIZED) szr->rgrc[0].bottom -= (WFRAME+2);
return 0;
}
在上面的代码中,我从第一个矩形的底部减去了边框的宽度。添加了额外的2个像素,以显示自动隐藏任务栏的位。最大化窗口现在可以正常工作,允许访问任务栏
为了在这个无边界窗口中创建我的虚拟客户端区域,我将这段代码添加到WM_create
和WM_SIZE
处理程序中:
WINDOWPLACEMENT wp;
GetWindowRect(hWnd, &rWnd);
GetClientRect(hWnd, &rClient);
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
rClient.left += WFRAME; rClient.right -= WFRAME; rClient.top += (WFRAME+cyMenu);
if (wp.showCmd == SW_SHOWNORMAL) rClient.bottom -= WFRAME;
cxClient = rClient.right-rClient.left;
cyClient = rClient.bottom-rClient.top;
元素
cyMenu
是为我的虚拟菜单栏保留的空间。它将包含一系列按钮,模拟菜单和最小/最大/关闭按钮。如何处理和调整那里的窗口大小?链接后面的文档告诉你如何操作。也许可以看看GLFW。这是一个非常好的窗口抽象库,可以可能应该处理此类问题()Windows在非最大化的窗口周围添加了一个不可见的边框。您可以使用DWMWA\u EXTENDED\u FRAME\u BOUNDS
标志使用DWMWA\u EXTENDED\u FRAME\u BOUNDS
来获取此边框的大小。我很高兴您得到了您的解决方案,感谢您的分享,如果您将其标记为答案,我将不胜感激,这将有利于其他合作伙伴社区。是的,我会将其标记为答案。不幸的是,当我回答自己的一个问题时,该网站将不允许我将其标记为“答案”,直到24小时后。
WINDOWPLACEMENT wp;
GetWindowRect(hWnd, &rWnd);
GetClientRect(hWnd, &rClient);
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
rClient.left += WFRAME; rClient.right -= WFRAME; rClient.top += (WFRAME+cyMenu);
if (wp.showCmd == SW_SHOWNORMAL) rClient.bottom -= WFRAME;
cxClient = rClient.right-rClient.left;
cyClient = rClient.bottom-rClient.top;