再次探讨消息循环共存的有关问题(望高手出手)

再次探讨消息循环共存的问题(望高手出手)

主窗口--------------------模式对话框,三个按钮,idok, idcancel, idc_button1


前2个按钮点击后,关闭对话框; 后一个按钮,点击后产生一个about对话框(注意,有意用非模式对话框)


目标 :

(1)

当主窗口是模式对话框的时候, 可以验证  文本框可以随意编辑,并做出一些列动作。

证明: 当主窗口是模式的时候, 文本框和主窗口共用一个消息循环!

(2)

当主窗口是模式对话框的时候, 弹出一个非模式about对话框,想看这个非模式对话框是否和主窗口共用一个消息循环。

于是有了这样的代码:


INT_PTR CALLBACK DialogProc(
_In_  HWND hwndDlg,
_In_  UINT uMsg,
_In_  WPARAM wParam,
_In_  LPARAM lParam
)
{

switch(uMsg)
{
case WM_INITDIALOG:
oldWndProc=SetWindowLong(GetDlgItem(hwndDlg,IDC_EDIT1),GWL_WNDPROC,(LONG)EditProc);

return TRUE;
break;
case WM_CLOSE:
EndDialog(hwndDlg,0);
// DestroyWindow(hwndDlg);
return TRUE;
break;
case WM_COMMAND:
{
WORD nId=LOWORD(wParam);
switch(nId)
{
case IDOK:
case IDCANCEL:
// DestroyWindow(hwndDlg);
EndDialog(hwndDlg,0);
return TRUE;
break;

case IDC_BUTTON1: //定位这段代码了, 原因嘛,呵呵,很可能是没有消息循环才不出现这个子窗口的

CreateDialog(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hwndDlg,About);
ShowWindow(hwndDlg,SW_SHOW);

return TRUE;

break;

default:
return FALSE;
break;
}
}
break;

case WM_DESTROY:
PostQuitMessage(0);
return TRUE;
default:
return  FALSE;
}

return FALSE;
}



整个程序里没有任何getmessage之类的函数,                          或许这个原因导致。

我点击按钮,并不会产生我们要看到的about对话框!



是否是以为            主窗口和about对话框没有共用同一个消息循环才导致的?



问题2: 对主对话框的wm_destroy是否需要修改,这个case里进行 destroywindow(about);

然后才是postquitmessage(0);         ?



------最佳解决方案--------------------
WM_DESTROY先送到parent,然后送到child,收到这个信息意味着资源正在被释放,一般要做的也就是PostQuitMessage(0);来结束进程,进程结束,一切资源被操作系统回收. 如果主窗口不在了,child窗口也不会存在,所以也就不需要call了,当然有什么资源在手的除外.
------其他解决方案--------------------
引用:
多谢老师,却是你说的这个问题。

不过一直有个小问题困惑我。

主窗口是一个模式对话框,对吧。

添加资源后,一般来说,对话框资源风格,根本不需要你去修改它,然后你就可以 dialogbox了。

就会弹出,不可能程序执行……


注意看DialogBox和CreateDialog的Remarks部分:

DialogBox:
The function displays the dialog box (regardless of whether the template specifies the WS_VISIBLE style)

CreateDialog:
The function displays the dialog box if the template specifies the WS_VISIBLE style.
------其他解决方案--------------------
1.
在GetMessage()后面,加上IsDialogMessage()

while (GetMessage (&msg, NULL, 0, 0))
{
     if (hDlgModeless == 0 ¦¦ !IsDialogMessage (hDlgModeless, &msg))
     {
          if (!TranslateAccelerator (hwnd, hAccel, &msg))