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