2016-04-04 2 views
2

Я пытаюсь сделать окно без полей в Qt5.6.0 с функциональностью aero-snap. Все работает, за исключением случаев, когда я максимизирую окно: он слишком большой.Окно без полей с Aero Snap слишком велико в максимизированном состоянии

Мое разрешение экрана 2560x1440, так что окно должно быть размером 2560x1400 (40 пикселей для панели задач), но в WM_SIZE сообщения, новый размер 2576x1416. Таким образом, окно в точности соответствует 8 пикселям в каждом направлении. Это также означает, что окно не выровнено в верхнем левом углу, это ровно 8 пикселей за пределами экрана в обоих направлениях.

Я не могу найти решение этой проблемы, все, что я пробовал, не работает и вызывает ошибки.

Единственное, что исправляет это, заключается в удалении стилей WS_CAPTION и WS_THICKFRAME, но затем я теряю функциональность привязки iso.

Я как-то должен сказать Qt или DWM, чтобы сделать окно на 16 пикселей меньше и переместить его на 8 пикселей вправо и снизу. Кто-нибудь знает, как это сделать?

ответ

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 2 015, и они имеют тот же размер, что и моя версия без полей, на 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; 
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 - это диспетчер рабочего стола? Тогда платформа - это Windows.

Пока речь идет о Qt 5.6, и вы, скорее всего речь идет о виджете с Qt :: CustomizeWindowHint набор атрибутов, то есть известная ошибка в Qt, которая не фиксируется еще:

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

Я наткнулся на эту ошибку пару раз, и обходной путь, предложенный BiTOk по приведенной выше ссылке, работал для меня.

Смежные вопросы