簡體   English   中英

Aero Snap的無邊界窗口在最大化狀態下過大

[英]Borderless window with Aero Snap too large in maximized state

我試圖在Qt5.6.0中制作一個無邊框窗口,並具有航空捕捉功能。 一切正常,除非我最大化窗口:它太大了。

我的屏幕分辨率為2560x1440 ,因此窗口的大小應為2560x1400 (任務欄為40像素),但是在WM_SIZE消息中,新大小為2576x1416 因此,窗口在每個方向上都正好大於8個像素。 這也意味着該窗口未在左上角對齊,在兩個方向上都離屏幕正好8像素。

我找不到這個問題的解決方案,我嘗試過的所有方法都無法正常工作,並且會導致錯誤。

解決此問題的唯一方法是刪除WS_CAPTIONWS_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM