Huw Davies : comctl32: Enable the appropriate wizard buttons before sending DM_SETDEFID.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Oct 30 09:23:15 CDT 2014


Module: wine
Branch: master
Commit: 433df0d5d8763e24772e60168bb8f1a664bd9ed8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=433df0d5d8763e24772e60168bb8f1a664bd9ed8

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Oct 28 15:01:18 2014 +0000

comctl32: Enable the appropriate wizard buttons before sending DM_SETDEFID.

---

 dlls/comctl32/propsheet.c       | 21 +++++----------------
 dlls/comctl32/tests/propsheet.c | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 16 deletions(-)

diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c
index 0dd1ca7..5de0deb 100644
--- a/dlls/comctl32/propsheet.c
+++ b/dlls/comctl32/propsheet.c
@@ -2430,15 +2430,16 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
   HWND hwndBack   = GetDlgItem(hwndDlg, IDC_BACK_BUTTON);
   HWND hwndNext   = GetDlgItem(hwndDlg, IDC_NEXT_BUTTON);
   HWND hwndFinish = GetDlgItem(hwndDlg, IDC_FINISH_BUTTON);
+  BOOL enable_finish = ((dwFlags & PSWIZB_FINISH) || psInfo->hasFinish) && !(dwFlags & PSWIZB_DISABLEDFINISH);
 
   TRACE("%d\n", dwFlags);
 
-  EnableWindow(hwndBack, FALSE);
-  EnableWindow(hwndNext, FALSE);
-  EnableWindow(hwndFinish, FALSE);
+  EnableWindow(hwndBack, dwFlags & PSWIZB_BACK);
+  EnableWindow(hwndNext, dwFlags & PSWIZB_NEXT);
+  EnableWindow(hwndFinish, enable_finish);
 
   /* set the default pushbutton to an enabled button */
-  if (((dwFlags & PSWIZB_FINISH) || psInfo->hasFinish) && !(dwFlags & PSWIZB_DISABLEDFINISH))
+  if (enable_finish)
     SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
   else if (dwFlags & PSWIZB_NEXT)
     SendMessageW(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0);
@@ -2447,13 +2448,6 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
   else
     SendMessageW(hwndDlg, DM_SETDEFID, IDCANCEL, 0);
 
-
-  if (dwFlags & PSWIZB_BACK)
-    EnableWindow(hwndBack, TRUE);
-
-  if (dwFlags & PSWIZB_NEXT)
-    EnableWindow(hwndNext, TRUE);
-
   if (!psInfo->hasFinish)
   {
     if ((dwFlags & PSWIZB_FINISH) || (dwFlags & PSWIZB_DISABLEDFINISH))
@@ -2463,9 +2457,6 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
       
       /* Show the Finish button */
       ShowWindow(hwndFinish, SW_SHOW);
-
-      if (!(dwFlags & PSWIZB_DISABLEDFINISH))
-        EnableWindow(hwndFinish, TRUE);
     }
     else
     {
@@ -2475,8 +2466,6 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
       ShowWindow(hwndNext, SW_SHOW);
     }
   }
-  else if (!(dwFlags & PSWIZB_DISABLEDFINISH))
-    EnableWindow(hwndFinish, TRUE);
 }
 
 /******************************************************************************
diff --git a/dlls/comctl32/tests/propsheet.c b/dlls/comctl32/tests/propsheet.c
index d3112d5..2797e94 100644
--- a/dlls/comctl32/tests/propsheet.c
+++ b/dlls/comctl32/tests/propsheet.c
@@ -279,6 +279,37 @@ static INT_PTR CALLBACK nav_page_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM
     return FALSE;
 }
 
+static WNDPROC old_nav_dialog_proc;
+
+static LRESULT CALLBACK new_nav_dialog_proc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
+{
+    switch (msg)
+    {
+    case DM_SETDEFID:
+        ok( IsWindowEnabled( GetDlgItem(hwnd, wp) ), "button is not enabled\n" );
+        break;
+    }
+    return CallWindowProcW( old_nav_dialog_proc, hwnd, msg, wp, lp );
+}
+
+static LRESULT CALLBACK hook_proc( int code, WPARAM wp, LPARAM lp )
+{
+    static BOOL done;
+    if (code == HCBT_CREATEWND)
+    {
+        CBT_CREATEWNDW *c = (CBT_CREATEWNDW *)lp;
+
+        /* The first dialog created will be the parent dialog */
+        if (!done && c->lpcs->lpszClass == MAKEINTRESOURCEW(WC_DIALOG))
+        {
+            old_nav_dialog_proc = (WNDPROC)SetWindowLongPtrW( (HWND)wp, GWLP_WNDPROC, (LONG_PTR)new_nav_dialog_proc );
+            done = TRUE;
+        }
+    }
+
+    return CallNextHookEx( NULL, code, wp, lp );
+}
+
 static void test_wiznavigation(void)
 {
     HPROPSHEETPAGE hpsp[4];
@@ -291,6 +322,10 @@ static void test_wiznavigation(void)
     BOOL hwndtoindex_supported = TRUE;
     const INT nextID = 12324;
     const INT backID = 12323;
+    HHOOK hook;
+
+    /* set up a hook proc in order to subclass the main dialog early on */
+    hook = SetWindowsHookExW( WH_CBT, hook_proc, NULL, GetCurrentThreadId() );
 
     /* create the property sheet pages */
     memset(psp, 0, sizeof(PROPSHEETPAGEA) * 4);
@@ -400,6 +435,7 @@ static void test_wiznavigation(void)
     ok(defidres == MAKELRESULT(nextID, DC_HASDEFID), "Expected default button ID to be %d, is %d\n", nextID, LOWORD(defidres));
 
     DestroyWindow(hdlg);
+    UnhookWindowsHookEx( hook );
 }
 
 static void test_buttons(void)




More information about the wine-cvs mailing list