![](/img/trans.png)
[英]Borderless window in Qt on Windows which supports native features: aero snap, DWM resize and minimization
[英]Borderless window with Aero Snap too large in maximized state
我試圖在Qt5.6.0中制作一個無邊框窗口,並具有航空捕捉功能。 一切正常,除非我最大化窗口:它太大了。
我的屏幕分辨率為2560x1440
,因此窗口的大小應為2560x1400
(任務欄為40像素),但是在WM_SIZE
消息中,新大小為2576x1416
。 因此,窗口在每個方向上都正好大於8個像素。 這也意味着該窗口未在左上角對齊,在兩個方向上都離屏幕正好8像素。
我找不到這個問題的解決方案,我嘗試過的所有方法都無法正常工作,並且會導致錯誤。
解決此問題的唯一方法是刪除WS_CAPTION
和WS_THICKFRAME
樣式,但是隨后我失去了areo snap功能。
我必須以某種方式告訴Qt或DWM將窗口縮小16個像素,並將其向右下方移動8個像素。 是否有人對此有想法?
我必須以某種方式告訴Qt或DWM將窗口縮小16個像素,並將其向右下方移動8個像素。 是否有人對此有想法?
DWM是桌面窗口管理器嗎? 然后該平台就是Windows。
只要是關於Qt 5.6的,並且您很可能在談論設置了Qt :: CustomizeWindowHint屬性的小部件,那么Qt中就有一個已知的錯誤尚未修復:
https://bugreports.qt.io/browse/QTBUG-4362
我偶然發現了該錯誤幾次, BiTOk在上面的鏈接中提出的解決方法對我來說很有效。
我的第一次嘗試是將窗口幾何設置為可用的幾何:
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;
其他帖子已經回答了這個問題,但是我想補充一點,使用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});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.