Handling dialog messages for non-template based dialogs

Dmitry Timoshkov dmitry at baikal.ru
Thu Apr 15 07:17:56 CDT 2004


"Santosh Siddheshwar" <santosh.s at sonata-software.com> wrote:

> OK.One place where this could be done is WM_NCCREATE which comes before
> WM_CREATE. Other place (possibly better) where it might be possible to do
> this is in CBTProc hook procedure. Not sure about the second option though.
> Any thoughts?

Attached test case shows that dialog info is initialized on the very first
DefDlgProc invocation.

So, DefDlgProc16/A/W as the very first thing should call DIALOG_get_info and
if it returns NULL initialize dialog structures.

Alexandre, please apply the test as soon as the dialog initialization is fixed.

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Add a message test for custom dialog initialization.

-- 
Dmitry.
-------------- next part --------------
--- cvs/hq/wine/dlls/user/tests/msg.c	Tue Apr 13 02:17:44 2004
+++ wine/dlls/user/tests/msg.c	Thu Apr 15 12:07:24 2004
@@ -148,6 +148,7 @@ static const struct message WmShowVisibl
     { WM_NCACTIVATE, sent|wparam, 1 },
     { WM_ACTIVATE, sent|wparam, 1 },
     { HCBT_SETFOCUS, hook },
+    { WM_KILLFOCUS, sent|parent },
     { WM_IME_SETCONTEXT, sent|defwinproc|optional },
     { WM_SETFOCUS, sent|defwinproc },
     { 0 }
@@ -278,6 +279,33 @@ static const struct message WmReparentBu
     { WM_SHOWWINDOW, sent|wparam, 1 },
     { 0 }
 };
+/* Creation of a custom dialog (32) */
+static const struct message WmCreateCustomDialogSeq[] = {
+    { HCBT_CREATEWND, hook },
+    { WM_GETMINMAXINFO, sent },
+    { WM_NCCREATE, sent },
+    { WM_NCCALCSIZE, sent|wparam, 0 },
+    { WM_CREATE, sent },
+    { WM_SHOWWINDOW, sent|wparam, 1 },
+    { HCBT_ACTIVATE, hook },
+    { WM_QUERYNEWPALETTE, sent|wparam|lparam|optional, 0, 0 },
+    { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+    { WM_NCACTIVATE, sent|wparam, 1 },
+    { WM_ACTIVATE, sent|wparam, 1 },
+    { WM_KILLFOCUS, sent|parent },
+    { WM_IME_SETCONTEXT, sent|optional },
+    { WM_SETFOCUS, sent },
+    { WM_GETDLGCODE, sent|defwinproc|wparam, 0 },
+    { WM_WINDOWPOSCHANGING, sent|wparam, 0 },
+    { WM_NCPAINT, sent|wparam, 1 },
+    { WM_GETTEXT, sent|defwinproc },
+    { WM_ERASEBKGND, sent },
+    { WM_CTLCOLORDLG, sent|defwinproc },
+    { WM_WINDOWPOSCHANGED, sent|wparam, 0 },
+    { WM_SIZE, sent },
+    { WM_MOVE, sent },
+    { 0 }
+};
 /* Creation of a modal dialog (32) */
 static const struct message WmCreateModalDialogSeq[] = { /* FIXME: add */
     { WM_CANCELMODE, sent|parent },
@@ -637,6 +665,13 @@ static void test_messages(void)
     ok_sequence(WmShowVisiblePopupSeq_2, "CreateWindow:show_visible_popup_2");
     DestroyWindow(hchild);
 
+    flush_sequence();
+    hwnd = CreateWindowExA(WS_EX_DLGMODALFRAME, "TestDialogClass", NULL, WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_DLGFRAME,
+                           0, 0, 100, 100, hparent, 0, 0, NULL);
+    ok(hwnd != 0, "Failed to create custom dialog window\n");
+    ok_sequence(WmCreateCustomDialogSeq, "CreateCustomDialog");
+    DestroyWindow(hwnd);
+
     DestroyWindow(hparent);
     flush_sequence();
 
@@ -648,17 +683,17 @@ static void test_messages(void)
                            100, 100, 200, 200, 0, hmenu, 0, NULL);
     ok_sequence(WmCreateOverlappedSeq, "CreateWindow:overlapped");
     ok (SetMenu(hwnd, 0), "SetMenu");
-    ok_sequence(WmSetMenuNonVisibleSizeChangeSeq, "SetMenu:NonVisibleSizeChange");    
+    ok_sequence(WmSetMenuNonVisibleSizeChangeSeq, "SetMenu:NonVisibleSizeChange");
     ok (SetMenu(hwnd, 0), "SetMenu");
-    ok_sequence(WmSetMenuNonVisibleNoSizeChangeSeq, "SetMenu:NonVisibleNoSizeChange");    
+    ok_sequence(WmSetMenuNonVisibleNoSizeChangeSeq, "SetMenu:NonVisibleNoSizeChange");
     ShowWindow(hwnd, SW_SHOW);
     flush_sequence();
     ok (SetMenu(hwnd, 0), "SetMenu");
-    ok_sequence(WmSetMenuVisibleNoSizeChangeSeq, "SetMenu:VisibleNoSizeChange");    
+    ok_sequence(WmSetMenuVisibleNoSizeChangeSeq, "SetMenu:VisibleNoSizeChange");
     ok (SetMenu(hwnd, hmenu), "SetMenu");
-    ok_sequence(WmSetMenuVisibleSizeChangeSeq, "SetMenu:VisibleSizeChange");    
-    DestroyWindow(hwnd);
+    ok_sequence(WmSetMenuVisibleSizeChangeSeq, "SetMenu:VisibleSizeChange");
 
+    DestroyWindow(hwnd);
 }
 
 static LRESULT WINAPI MsgCheckProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -719,7 +754,8 @@ static LRESULT WINAPI ParentMsgCheckProc
 
     trace("parent: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);
 
-    if (message == WM_PARENTNOTIFY)
+    if (message == WM_PARENTNOTIFY || message == WM_CANCELMODE ||
+	message == WM_KILLFOCUS || message == WM_ENABLE)
     {
         msg.message = message;
         msg.flags = sent|parent|wparam|lparam;
@@ -736,6 +772,32 @@ static LRESULT WINAPI ParentMsgCheckProc
     return ret;
 }
 
+static LRESULT WINAPI TestDlgProcA(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    static long defwndproc_counter = 0;
+    LRESULT ret;
+    struct message msg;
+
+    trace("dialog: %p, %04x, %08x, %08lx\n", hwnd, message, wParam, lParam);
+
+    DefDlgProcA(hwnd, DM_SETDEFID, 1, 0);
+    ret = DefDlgProcA(hwnd, DM_GETDEFID, 0, 0);
+    ok(HIWORD(ret) == DC_HASDEFID, "DM_GETDEFID should return DC_HASDEFID\n");
+
+    msg.message = message;
+    msg.flags = sent|wparam|lparam;
+    if (defwndproc_counter) msg.flags |= defwinproc;
+    msg.wParam = wParam;
+    msg.lParam = lParam;
+    add_message(&msg);
+
+    defwndproc_counter++;
+    ret = DefDlgProcA(hwnd, message, wParam, lParam);
+    defwndproc_counter--;
+
+    return ret;
+}
+
 static BOOL RegisterWindowClasses(void)
 {
     WNDCLASSA cls;
@@ -764,6 +826,11 @@ static BOOL RegisterWindowClasses(void)
     cls.lpszClassName = "SimpleWindowClass";
     if(!RegisterClassA(&cls)) return FALSE;
 
+    ok(GetClassInfoA(0, "#32770", &cls), "GetClassInfo failed\n");
+    cls.lpfnWndProc = TestDlgProcA;
+    cls.lpszClassName = "TestDialogClass";
+    if(!RegisterClassA(&cls)) return FALSE;
+
     return TRUE;
 }
 
@@ -780,7 +847,8 @@ static LRESULT CALLBACK cbt_hook_proc(in
 	if (!strcmp(buf, "TestWindowClass") ||
 	    !strcmp(buf, "TestParentClass") ||
 	    !strcmp(buf, "TestPopupClass") ||
-	    !strcmp(buf, "SimpleWindowClass"))
+	    !strcmp(buf, "SimpleWindowClass") ||
+	    !strcmp(buf, "TestDialogClass"))
 	{
 	    struct message msg;
 


More information about the wine-patches mailing list