SetFocus and DefPushButton management
Jakob Eriksson
jakov at vmlinux.org
Wed Mar 16 03:42:32 CST 2005
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 button
>+ CtrlState = SendMessage (GetDlgItem(hDlg, IDOK), BM_GETSTATE, 0, 0);
>+ if (CtrlState == BST_FOCUS)
>+ hwndFocusCtrl = GetDlgItem(hDlg, IDOK);
>+ // Check if IDOK is the default push button
>+ DlgCode = 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))
>
>
More information about the wine-devel
mailing list