After the creation of a dialog if the focus is set on a PushButton this one must have also the BS_DEFPUSHBUTTON style like in windows. Attached the patch with a regression test.
Katia
Send it to wine-patches if you want it merged in CVS.
Katia Maculan wrote:
After the creation of a dialog if the focus is set on a PushButton this one must have also the BS_DEFPUSHBUTTON style like in windows. Attached the patch with a regression test.
Katia
diff -urN oldwinedir/dlls/user/tests/dialog.c newwinedir/dlls/user/tests/dialog.c --- oldwinedir/dlls/user/tests/dialog.c 2005-03-07 12:12:40.000000000 +0100 +++ newwinedir/dlls/user/tests/dialog.c 2005-03-14 16:33:03.000000000 +0100 @@ -849,6 +849,40 @@ } }
+static LRESULT CALLBACK DlgFocusProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{
- HWND hwndFocusCtrl = NULL;
- HWND hwndDefPushButton = NULL;
- LRESULT DlgCode;
- LRESULT CtrlState;
- switch (message)
- {
case WM_INITDIALOG:PostMessage(hDlg, WM_USER, 0, 0);return TRUE;case WM_USER:// Check if the focus is on IDOK buttonCtrlState = SendMessage (GetDlgItem(hDlg, IDOK), BM_GETSTATE, 0, 0);if (CtrlState == BST_FOCUS)hwndFocusCtrl = GetDlgItem(hDlg, IDOK);// Check if IDOK is the default push buttonDlgCode = SendMessage (GetDlgItem(hDlg, IDOK), WM_GETDLGCODE, 0, 0);if (DlgCode & DLGC_DEFPUSHBUTTON)hwndDefPushButton = GetDlgItem(hDlg, IDOK);ok (hwndFocusCtrl && hwndDefPushButton, "The focus and the DLGC_DEFPUSHBUTTON style are not in the same button\n");EndDialog(hDlg, LOWORD(wParam));return TRUE;- }
- return FALSE;
+}
+static void InitialFocusTest1 (void) +{
- DialogBox(g_hinst, "DEFPUSHBUTTON_TEST_DIALOG", NULL, (DLGPROC)DlgFocusProc);
+}
START_TEST(dialog) { @@ -860,4 +894,5 @@ IsDialogMessageWTest(); WM_NEXTDLGCTLTest(); InitialFocusTest();
- InitialFocusTest1();
} diff -urN oldwinedir/windows/dialog.c newwinedir/windows/dialog.c --- oldwinedir/windows/dialog.c 2005-03-07 12:12:54.000000000 +0100 +++ newwinedir/windows/dialog.c 2005-03-14 16:30:19.000000000 +0100 @@ -669,8 +669,23 @@ { /* By returning TRUE, app has requested a default focus assignment */ dlgInfo->hwndFocus = GetNextDlgTabItem( hwnd, 0, FALSE);
if( dlgInfo->hwndFocus )SetFocus( dlgInfo->hwndFocus );
if (dlgInfo->hwndFocus){SetFocus( dlgInfo->hwndFocus );HWND hWndOldDefPushButton = NULL;if (SendMessageW(dlgInfo->hwndFocus, WM_GETDLGCODE, 0, 0)& (DLGC_UNDEFPUSHBUTTON | DLGC_BUTTON)){SendMessageA (dlgInfo->hwndFocus, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);/*Check for a previous defpushbutton*/if (dlgInfo->idResult){hWndOldDefPushButton = GetDlgItem (hwnd,dlgInfo->idResult);if (hWndOldDefPushButton && (hWndOldDefPushButton != dlgInfo->hwndFocus))SendMessageA (hWndOldDefPushButton, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);}}} }if (template.style & WS_VISIBLE && !(GetWindowLongW( hwnd, GWL_STYLE ) & WS_VISIBLE))
On Wed, Mar 16, 2005 at 10:22:51AM +0100, Katia Maculan wrote:
SendMessageA (dlgInfo->hwndFocus, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
^^^^^^^^^^^^^ Please use SendMessageW instead.
/*Check for a previous defpushbutton*/if (dlgInfo->idResult){hWndOldDefPushButton = GetDlgItem (hwnd,dlgInfo->idResult);if (hWndOldDefPushButton && (hWndOldDefPushButton != dlgInfo->hwndFocus))SendMessageA (hWndOldDefPushButton, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
^^^^^^^^^^^^ Ditto.