您可以使用CreateDialog功能创建无模式对话框,指定对话框模板资源的标识符或名称以及对话框过程的地址。CreateDialog加载模板,创建对话框,并可选择显示它。您的应用程序负责检索和调度用户输入消息到对话框过程。
在以下示例中,如果用户从应用程序菜单中选择了“转到”命令,则应用程序将在__中显示无模式对话框__。该对话框包含编辑控件,复选框和确定和取消按钮。对话框模板是应用程序的可执行文件中的资源,并具有资源标识符DLG_GOTO。用户在编辑控件中输入行号,并检查复选框以指定行号相对于当前行。控制标识符为ID_LINE,ID_ABSREL,IDOK和IDCANCEL。
示例第一部分中的语句创建无模式对话框。这些语句在应用程序主窗口的窗口过程中,当窗口过程接收到具有IDM_GOTO命令标识符的WM_COMMAND消息时,但仅当全局变量【hwndGoto】尚未包含有效句柄时才会创建对话框。示例的第二部分是应用程序的主要消息循环。该循环包括IsDialogMessage功能,以确保用户可以在此无模式对话框中使用对话框键盘界面。示例的第三部分是对话框过程。当用户选择“确定”按钮时,程序将检索编辑控件的内容和复选框。当用户选择取消按钮时,该过程会销毁对话框。
HWND hwndGoto = NULL; //对话框的窗口句柄
.
.
.
case WM_COMMAND:
开关(LOWORD(wParam)){
case IDM_GOTO:
if(!IsWindow(hwndGoto)){
hwndGoto = CreateDialog(hinst,
MAKEINTRESOURCE(DLG_GOTO),
hwnd, (DLGPROC) GoToProc);
ShowWindow(hwndGoto, SW_SHOW);
}
break;
}
return 0L;
在前面的陈述中,只有【hwndGoto】 【不】包含有效的窗口句柄时才调用CreateDialog.这样可以确保应用程序不会同时显示两个对话框。要支持这种检查方法,对话框过程必须在销毁对话框时将【hwndGoto】设置为NULL。
应用程序的消息循环包含以下语句:
while(GetMessage(& msg,NULL,NULL,NULL)){
if(!IsWindow(hwndGoto)||!IsDialogMessage(hwndGoto,& msg)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
循环检查对话框的窗口句柄的有效性,只有在句柄有效时才调用IsDialogMessage函数。IsDialogMessage仅在消息属于对话框时处理消息。否则,它返回FALSE,循环将消息发送到适当的窗口。
以下语句定义对话框过程:
int iLine; //接收行号
BOOL fRelative; //接收复选框状态
.
.
.
BOOL CALLBACK GoToProc(hwndDlg, message, wParam, lParam)
HWND hwndDlg;
UINT message;
WPARAM wParam;
LPARAM lParam;
{
BOOL fError;
switch(message){
case WM_INITDIALOG:
CheckDlgButton(hwndDlg, ID_ABSREL, fRelative);
return TRUE;
case WM_COMMAND:
开关(LOWORD(wParam)){
case IDOK:
fRelative = IsDlgButtonChecked(hwndDlg,
ID_ABSREL);
iLine = GetDlgItemInt(hwndDlg, ID_LINE,
&fError, fRelative);
if(fError){
的MessageBox(hwndDlg,SZINVALIDNUMBER,hu
SZGOTOERR, MB_OK);
SendDlgItemMessage(hwndDlg,ID_LINE,
EM_SETSEL, 0, -1L);
}其他
.
. //通知所有者窗口进行携带
. //输出命令。
.
return TRUE;
case IDCANCEL:
DestroyWindow(hwndDlg);
hwndGoto = NULL;
return TRUE;
}
}
return FALSE;
}
在上述语句中,该过程处理WM_INITDIALOG和WM_COMMAND消息。在WM_INITDIALOG处理过程中,该过程通过将全局变量【fRelative】的当前值传递给CheckDlgButton来初始化复选框。然后,该过程返回TRUE,以指示Windows设置默认输入焦点。
在WM_COMMAND处理期间,仅当用户选择取消按钮__时,该过程才会关闭该对话框,即具有IDCANCEL标识符的按钮。该过程必须调用DestroyWindow关闭无模式对话框。请注意,该过程还将【hwndGoto】变量设置为NULL,以确保依赖此变量的其他语句正常运行。
如果用户选择“确定”按钮,则过程将检索该复选框的当前状态并将其分配给【fRelative】变量。然后使用该变量从编辑控件中检索行号。GetDlgItemInt将编辑控件中的文本转换为整数。值【fRelative】确定函数是否将该数字解释为有符号或无符号值。如果编辑控件文本不是有效的数字,GetDlgItemInt将【FERROR】变量的值设置为非零。该过程检查该值以确定是否显示错误消息或执行命令。如果发生错误,对话框程序会向编辑控件发送一条消息,指示它选择控件中的文本,以便用户可以轻松地替换它。如果GetDlgItemInt不返回错误,则该过程可以自己执行所请求的命令,也可以向所有者窗口发送消息,指示执行命令。