Windows QPA: Fix close button not working on Windows 7
A previous change modified hit testing in the non-client area of fixed-size windows, in order to prevent showing a resize cursor when the windows are not resizable (QTBUG-77220). The change assigned HTCAPTION for any point over the entire title bar, including the top bar buttons, which on Windows 7 classic or basic desktop caused these buttons to become unresponsive. The present fix changes this behavior to redefine only the outer sizing frame, while letting the rest of the title bar be handled by DefWindowProc(). Fixes: QTBUG-78262 Change-Id: Id6e821a805c8333a67988f87c3727bed0c93290e Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>bb10
parent
c4956dbb67
commit
a8ec52d5e7
|
|
@ -2645,10 +2645,16 @@ bool QWindowsWindow::handleNonClientHitTest(const QPoint &globalPos, LRESULT *re
|
|||
return true;
|
||||
}
|
||||
if (localPos.y() < 0) {
|
||||
const int topResizeBarPos = -frameMargins().top();
|
||||
if (localPos.y() >= topResizeBarPos)
|
||||
// We want to return HTCAPTION/true only over the outer sizing frame, not the entire title bar,
|
||||
// otherwise the title bar buttons (close, etc.) become unresponsive on Windows 7 (QTBUG-78262).
|
||||
// However, neither frameMargins() nor GetSystemMetrics(SM_CYSIZEFRAME), etc., give the correct
|
||||
// sizing frame height in all Windows versions/scales. This empirical constant seems to work, though.
|
||||
const int sizingHeight = 9;
|
||||
const int topResizeBarPos = sizingHeight - frameMargins().top();
|
||||
if (localPos.y() < topResizeBarPos) {
|
||||
*result = HTCAPTION; // Extend caption over top resize bar, let's user move the window.
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fixedWidth && (localPos.x() < 0 || localPos.x() >= size.width())) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue