Windows: Add hit test handling for non-client areas.
Suppress resize cursor for fixed size windows. Task-number: QTBUG-32663 Change-Id: I9579bb13d494fe21e5db7b75d01a3cf1b693c7f6 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>bb10
parent
d91afa1558
commit
eb2ae61cb4
|
|
@ -88,6 +88,7 @@ enum WindowsEventType // Simplify event types
|
|||
CursorEvent = MouseEventFlag + 3,
|
||||
TouchEvent = TouchEventFlag + 1,
|
||||
NonClientMouseEvent = NonClientEventFlag + MouseEventFlag + 1,
|
||||
NonClientHitTest = NonClientEventFlag + 2,
|
||||
KeyEvent = KeyEventFlag + 1,
|
||||
KeyDownEvent = KeyEventFlag + KeyDownEventFlag + 1,
|
||||
InputMethodKeyEvent = InputMethodEventFlag + KeyEventFlag + 1,
|
||||
|
|
@ -142,6 +143,10 @@ inline QtWindows::WindowsEventType windowsEventType(UINT message, WPARAM wParamI
|
|||
return QtWindows::ResizeEvent;
|
||||
case WM_NCCALCSIZE:
|
||||
return QtWindows::CalculateSize;
|
||||
#ifndef Q_OS_WINCE
|
||||
case WM_NCHITTEST:
|
||||
return QtWindows::NonClientHitTest;
|
||||
#endif // !Q_OS_WINCE
|
||||
case WM_GETMINMAXINFO:
|
||||
return QtWindows::QuerySizeHints;
|
||||
case WM_KEYDOWN: // keyboard event
|
||||
|
|
|
|||
|
|
@ -819,7 +819,9 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message,
|
|||
return true;// maybe available on some SDKs revisit WM_NCCALCSIZE
|
||||
case QtWindows::CalculateSize:
|
||||
return QWindowsGeometryHint::handleCalculateSize(platformWindow->customMargins(), msg, result);
|
||||
#endif
|
||||
case QtWindows::NonClientHitTest:
|
||||
return platformWindow->handleNonClientHitTest(QPoint(msg.pt.x, msg.pt.y), result);
|
||||
#endif // !Q_OS_WINCE
|
||||
case QtWindows::ExposeEvent:
|
||||
return platformWindow->handleWmPaint(hwnd, message, wParam, lParam);
|
||||
case QtWindows::NonClientMouseEvent:
|
||||
|
|
|
|||
|
|
@ -1796,6 +1796,47 @@ void QWindowsWindow::getSizeHints(MINMAXINFO *mmi) const
|
|||
if (QWindowsContext::verboseWindows)
|
||||
qDebug() << __FUNCTION__ << window() << *mmi;
|
||||
}
|
||||
|
||||
bool QWindowsWindow::handleNonClientHitTest(const QPoint &globalPos, LRESULT *result) const
|
||||
{
|
||||
// QTBUG-32663, suppress resize cursor for fixed size windows.
|
||||
const QWindow *w = window();
|
||||
if (!w->isTopLevel() // Task 105852, minimized windows need to respond to user input.
|
||||
|| (m_windowState != Qt::WindowNoState && m_windowState != Qt::WindowActive)
|
||||
|| (m_data.flags & Qt::FramelessWindowHint)) {
|
||||
return false;
|
||||
}
|
||||
const QSize minimumSize = w->minimumSize();
|
||||
if (minimumSize.isEmpty())
|
||||
return false;
|
||||
const QSize maximumSize = w->maximumSize();
|
||||
const bool fixedWidth = minimumSize.width() == maximumSize.width();
|
||||
const bool fixedHeight = minimumSize.height() == maximumSize.height();
|
||||
if (!fixedWidth && !fixedHeight)
|
||||
return false;
|
||||
const QPoint localPos = w->mapFromGlobal(globalPos);
|
||||
const QSize size = w->size();
|
||||
if (fixedHeight) {
|
||||
if (localPos.y() >= size.height()) {
|
||||
*result = HTBORDER; // Unspecified border, no resize cursor.
|
||||
return true;
|
||||
}
|
||||
if (localPos.y() < 0) {
|
||||
const QMargins margins = frameMargins();
|
||||
const int topResizeBarPos = margins.left() - margins.top();
|
||||
if (localPos.y() < topResizeBarPos) {
|
||||
*result = HTCAPTION; // Extend caption over top resize bar, let's user move the window.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fixedWidth && (localPos.x() < 0 || localPos.x() >= size.width())) {
|
||||
*result = HTBORDER; // Unspecified border, no resize cursor.
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif // !Q_OS_WINCE
|
||||
|
||||
#ifndef QT_NO_CURSOR
|
||||
|
|
|
|||
|
|
@ -234,7 +234,8 @@ public:
|
|||
void releaseDC();
|
||||
#ifndef Q_OS_WINCE // maybe available on some SDKs revisit WM_GETMINMAXINFO
|
||||
void getSizeHints(MINMAXINFO *mmi) const;
|
||||
#endif
|
||||
bool handleNonClientHitTest(const QPoint &globalPos, LRESULT *result) const;
|
||||
#endif // !Q_OS_WINCE
|
||||
|
||||
#ifndef QT_NO_CURSOR
|
||||
QWindowsWindowCursor cursor() const { return m_cursor; }
|
||||
|
|
|
|||
Loading…
Reference in New Issue