summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Liu <net147@gmail.com>2012-06-12 11:50:03 (GMT)
committerQt by Nokia <qt-info@nokia.com>2012-06-15 07:55:25 (GMT)
commitf48918b7f32179ab034bdc5157876e230d70ba3e (patch)
tree296238e0340a6efcfda74543a35fa13c0705a346
parent7be0b570edf8db12fd541bdaa530b2defde71fa2 (diff)
downloadQt-f48918b7f32179ab034bdc5157876e230d70ba3e.zip
Qt-f48918b7f32179ab034bdc5157876e230d70ba3e.tar.gz
Qt-f48918b7f32179ab034bdc5157876e230d70ba3e.tar.bz2
QWizard/Win: Handle hit testing correctly for Vista style
Clicking the area just below the close button when Aero is enabled reveals duplicate caption buttons. DwmDefWindowProc returns hit results for DWM caption buttons but DefWindowProc may also return hit results for non-DWM caption buttons. To resolve this issue, if DefWindowProc returns a window button hit result then we just use HTCLIENT (the client area) as the hit result instead. Change-Id: Ia741ce4f9aa944109d8de54c2f84009f5ea1883f (cherry picked from commit 9ab445d264fbcf57c48374526905a2f870de06a3) Reviewed-by: Friedemann Kleint <Friedemann.Kleint@nokia.com>
-rw-r--r--src/gui/dialogs/qwizard_win.cpp85
1 files changed, 48 insertions, 37 deletions
diff --git a/src/gui/dialogs/qwizard_win.cpp b/src/gui/dialogs/qwizard_win.cpp
index 2e69437..f348704 100644
--- a/src/gui/dialogs/qwizard_win.cpp
+++ b/src/gui/dialogs/qwizard_win.cpp
@@ -366,25 +366,24 @@ void QVistaHelper::setTitleBarIconAndCaptionVisible(bool visible)
bool QVistaHelper::winEvent(MSG* msg, long* result)
{
- bool retval = true;
-
switch (msg->message) {
case WM_NCHITTEST: {
LRESULT lResult;
- pDwmDefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam, &lResult);
- if (lResult == HTCLOSE || lResult == HTMAXBUTTON || lResult == HTMINBUTTON || lResult == HTHELP)
+ // Perform hit testing using DWM
+ if (pDwmDefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam, &lResult)) {
+ // DWM returned a hit, no further processing necessary
*result = lResult;
- else
- *result = DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
- break;
- }
- case WM_NCMOUSEMOVE:
- case WM_NCLBUTTONDOWN:
- case WM_NCLBUTTONUP:
- case WIZ_WM_NCMOUSELEAVE: {
- LRESULT lResult;
- pDwmDefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam, &lResult);
- *result = DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
+ } else {
+ // DWM didn't return a hit, process using DefWindowProc
+ lResult = DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam);
+ // If DefWindowProc returns a window caption button, just return HTCLIENT (client area).
+ // This avoid unnecessary hits to Windows NT style caption buttons which aren't visible but are
+ // located just under the Aero style window close button.
+ if (lResult == HTCLOSE || lResult == HTMAXBUTTON || lResult == HTMINBUTTON || lResult == HTHELP)
+ *result = HTCLIENT;
+ else
+ *result = lResult;
+ }
break;
}
case WM_NCCALCSIZE: {
@@ -394,10 +393,16 @@ bool QVistaHelper::winEvent(MSG* msg, long* result)
break;
}
default:
- retval = false;
+ LRESULT lResult;
+ // Pass to DWM to handle
+ if (pDwmDefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam, &lResult))
+ *result = lResult;
+ // If the message wasn't handled by DWM, continue processing it as normal
+ else
+ return false;
}
- return retval;
+ return true;
}
void QVistaHelper::setMouseCursor(QPoint pos)
@@ -582,28 +587,34 @@ bool QVistaHelper::eventFilter(QObject *obj, QEvent *event)
winEvent(&msg, &result);
} else if (event->type() == QEvent::MouseButtonPress) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
- long result;
- MSG msg;
- msg.message = WM_NCHITTEST;
- msg.wParam = 0;
- msg.lParam = MAKELPARAM(mouseEvent->globalX(), mouseEvent->globalY());
- msg.hwnd = wizard->winId();
- winEvent(&msg, &result);
- msg.wParam = result;
- msg.message = WM_NCLBUTTONDOWN;
- winEvent(&msg, &result);
+
+ if (mouseEvent->button() == Qt::LeftButton) {
+ long result;
+ MSG msg;
+ msg.message = WM_NCHITTEST;
+ msg.wParam = 0;
+ msg.lParam = MAKELPARAM(mouseEvent->globalX(), mouseEvent->globalY());
+ msg.hwnd = wizard->winId();
+ winEvent(&msg, &result);
+ msg.wParam = result;
+ msg.message = WM_NCLBUTTONDOWN;
+ winEvent(&msg, &result);
+ }
} else if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
- long result;
- MSG msg;
- msg.message = WM_NCHITTEST;
- msg.wParam = 0;
- msg.lParam = MAKELPARAM(mouseEvent->globalX(), mouseEvent->globalY());
- msg.hwnd = wizard->winId();
- winEvent(&msg, &result);
- msg.wParam = result;
- msg.message = WM_NCLBUTTONUP;
- winEvent(&msg, &result);
+
+ if (mouseEvent->button() == Qt::LeftButton) {
+ long result;
+ MSG msg;
+ msg.message = WM_NCHITTEST;
+ msg.wParam = 0;
+ msg.lParam = MAKELPARAM(mouseEvent->globalX(), mouseEvent->globalY());
+ msg.hwnd = wizard->winId();
+ winEvent(&msg, &result);
+ msg.wParam = result;
+ msg.message = WM_NCLBUTTONUP;
+ winEvent(&msg, &result);
+ }
}
return false;