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