2016-04-04 25 views
2

Ich versuche, in Qt5.6.0, mit Aero-Snap-Funktionalität ein randloses Fenster zu machen. Alles funktioniert, außer wenn ich das Fenster maximiere: es ist zu groß.Borderless Fenster mit Aero Snap zu groß im maximierten Zustand

Meine Bildschirmauflösung ist 2560x1440, so dass das Fenster sollte 2560x1400 (40 Pixel für die Task-Leiste), aber in der WM_SIZE Nachricht, die neue Größe ist 2576x1416 bemessen sein. So ist das Fenster in jeder Richtung genau 8 Pixel zu groß. Dies bedeutet auch, dass das Fenster nicht in der oberen linken Ecke ausgerichtet ist, es ist genau 8 Pixel außerhalb des Bildschirms in beiden Richtungen.

Ich kann keine Lösung für dieses Problem finden, alles, was ich versucht habe funktioniert nicht und verursacht Fehler.

Die einzige Sache, die das behebt, ist die WS_CAPTION und WS_THICKFRAME Stile zu entfernen, aber dann verliere ich die Areo-Snap-Funktionalität.

Ich muss irgendwie Qt oder DWM sagen, um das Fenster 16 Pixel kleiner zu machen und es 8 Pixel nach rechts und unten zu bewegen. Hat jemand eine Idee, wie man das macht?

Antwort

0

Mein erster Versuch wurde die Einstellung der Fenstergeometrie auf die verfügbare Geometrie:

QRect rect = QApplication::desktop()->availableGeometry(); 
setGeometry(rect.left() , rect.top(), rect.right(), rect.bottom()); 

Das einzige Problem ist, dass das Fenster auf der rechten Seite ein Pixel zu klein ist und Unterseite und

setGeometry(rect.left() , rect.top(), rect.right() + 1, rect.bottom() + 1); 

gibt mir eine Fehlermeldung:

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) 

Dann schaute ich auf den Rechteck-Koordinaten von Visual Studio 2 015 und sie haben die gleiche Größe wie meine Implementierung eines randlosen Fensters, das in jeder Richtung 8 Pixel größer ist.

kann ich den Inhalt meiner Fenster es nicht geben eine Marge von 8 so nicht aus dem Bildschirm befestigen, wenn das Fenster maximiert ist und stellen Sie den Fensterbereich:

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); 

Wenn das Fenster wiederhergestellt wird, Wir müssen die vorherigen Änderungen zurücksetzen. Das Ergebnis ist:

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; 
0

I somehow have to tell Qt or DWM to make the window 16 pixels smaller and move it 8 pixels right, and bottom. Does anybody have an idea on how to do that?

DWM ist Desktop Window Manager? Dann ist die Plattform Windows.

Solange es über Qt 5.6 ist und Sie sehr wahrscheinlich reden über das Widget mit Qt :: CustomizeWindowHint Attribut dann ist es ein bekannter Fehler in Qt, die noch nicht festgelegt ist:

https://bugreports.qt.io/browse/QTBUG-4362

Ich bin ein paar Mal auf diesen Fehler gestoßen und die von BiTOk unter dem obigen Link vorgeschlagene Problemumgehung funktionierte für mich.