再次探讨消息循环共存的有关问题(望高手出手)
再次探讨消息循环共存的问题(望高手出手)
主窗口--------------------模式对话框,三个按钮,idok, idcancel, idc_button1
前2个按钮点击后,关闭对话框; 后一个按钮,点击后产生一个about对话框(注意,有意用非模式对话框)
目标 :
(1)
当主窗口是模式对话框的时候, 可以验证 文本框可以随意编辑,并做出一些列动作。
证明: 当主窗口是模式的时候, 文本框和主窗口共用一个消息循环!
(2)
当主窗口是模式对话框的时候, 弹出一个非模式about对话框,想看这个非模式对话框是否和主窗口共用一个消息循环。
于是有了这样的代码:
整个程序里没有任何getmessage之类的函数, 或许这个原因导致。
我点击按钮,并不会产生我们要看到的about对话框!
是否是以为 主窗口和about对话框没有共用同一个消息循环才导致的?
问题2: 对主对话框的wm_destroy是否需要修改,这个case里进行 destroywindow(about);
然后才是postquitmessage(0); ?
------最佳解决方案--------------------
WM_DESTROY先送到parent,然后送到child,收到这个信息意味着资源正在被释放,一般要做的也就是PostQuitMessage(0);来结束进程,进程结束,一切资源被操作系统回收. 如果主窗口不在了,child窗口也不会存在,所以也就不需要call了,当然有什么资源在手的除外.
------其他解决方案--------------------
注意看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))
主窗口--------------------模式对话框,三个按钮,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和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))