我正在尝试使用aero-snap功能在Qt5.6.0中创建一个无边框窗口。 一切正常,除非我最大化窗口:它太大了。
我的屏幕分辨率为2560x1440
,因此窗口的大小应为2560x1400
(任务栏为40像素),但在WM_SIZE
消息中,新大小为{{1} }。
因此窗口在每个方向上都是8个像素太大。
这也意味着窗口没有在左上角对齐,它在两个方向上的屏幕外正好是8个像素。
我找不到解决这个问题的方法,我所尝试的一切都不起作用并导致错误。
解决这个问题的唯一方法就是删除2576x1416
和WS_CAPTION
样式,但后来我失去了areo snap功能。
我不得不告诉Qt或DWM使窗口缩小16个像素并将其向右移动8个像素。有没有人知道如何做到这一点?
答案 0 :(得分:0)
我不得不告诉Qt或DWM使窗口缩小16个像素 然后向右移动8个像素。有没有人有想法 怎么做?
DWM是桌面窗口管理器?那么平台就是Windows。
只要它是关于Qt 5.6并且您很可能在Qt :: CustomizeWindowHint属性集中讨论小部件,那么Qt中存在一个尚未修复的已知错误:
https://bugreports.qt.io/browse/QTBUG-4362
我偶然发现了这个错误,BiTOk在上面链接中提出的解决方法对我有用。
答案 1 :(得分:0)
我的第一次尝试是将窗口几何设置为可用的几何体:
QRect rect = QApplication::desktop()->availableGeometry();
setGeometry(rect.left() , rect.top(), rect.right(), rect.bottom());
唯一的问题是窗口是右侧和底侧的像素太小而且
setGeometry(rect.left() , rect.top(), rect.right() + 1, rect.bottom() + 1);
给了我一个错误:
QWindowsWindow::setGeometry: Unable to set geometry 2560x1400+0+0 on QWidgetWindow/'MainWindowWindow'. Resulting geometry: 2576x1416+-8+-8 (frame: 0, 0, 0, 0, custom margin: 0, 0, 0, 0, minimum size: 45x13, maximum size: 16777215x16777215)
然后我查看了Visual Studio 2015的矩形坐标,它们的大小与我对无边框窗口的实现大小相同,每个方向都大8个像素。
我可以给窗口的内容一个8的边距,这样如果窗口最大化并设置窗口区域,它就不会剪切出屏幕:
setContentsMargins({ 8, 8, 8, 8 });
HRGN WinRgn;
RECT winrect;
GetClientRect(hwnd, &winrect);
WinRgn = CreateRectRgn(8, 8, winrect.right - 8, winrect.bottom - 8);
SetWindowRgn(hwnd, WinRgn, true);
当窗口恢复时,我们需要重置以前的更改。 结果是:
case WM_SIZE:
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hwnd, &wp);
if (wp.showCmd == SW_MAXIMIZE) {
setContentsMargins({ 8, 8, 8, 8 });
HRGN WinRgn;
RECT winrect;
GetClientRect(hwnd, &winrect);
WinRgn = CreateRectRgn(8, 8, winrect.right - 8, winrect.bottom - 8);
SetWindowRgn(hwnd, WinRgn, true);
UpdateWindow(hwnd);
is_fullscreen = true;
} else {
if (is_fullscreen) {
setContentsMargins({ 0, 0, 0, 0 });
SetWindowRgn(hwnd, NULL, true);
is_fullscreen = false;
}
}
break;
答案 2 :(得分:0)
其他帖子已经回答了这个问题,但我想补充一点,使用GetSystemMetrics
而不是8
的硬编码值可能是个好主意。
#include <Windows.h>
void MyWindow::changeEvent(QEvent* ev) {
if (ev->type() == QEvent::WindowStateChange) {
const auto state = windowState();
if(state & Qt::WindowMaximized) {
const int x = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
const int y = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
setContentsMargins({x, y, x, y});
}
else {
setContentsMargins({0, 0, 0, 0});
}
}