创建无模式对话框

【勇芳软件工作室】汉化HomePreviousNext

您可以使用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_INITDIALOGWM_COMMAND消息。在WM_INITDIALOG处理过程中,该过程通过将全局变量【fRelative】的当前值传递给CheckDlgButton来初始化复选框。然后,该过程返回TRUE,以指示Windows设置默认输入焦点。

在WM_COMMAND处理期间,仅当用户选择取消按钮__时,该过程才会关闭该对话框,即具有IDCANCEL标识符的按钮。该过程必须调用DestroyWindow关闭无模式对话框。请注意,该过程还将【hwndGoto】变量设置为NULL,以确保依赖此变量的其他语句正常运行。

如果用户选择“确定”按钮,则过程将检索该复选框的当前状态并将其分配给【fRelative】变量。然后使用该变量从编辑控件中检索行号。GetDlgItemInt将编辑控件中的文本转换为整数。值【fRelative】确定函数是否将该数字解释为有符号或无符号值。如果编辑控件文本不是有效的数字,GetDlgItemInt【FERROR】变量的值设置为非零。该过程检查该值以确定是否显示错误消息或执行命令。如果发生错误,对话框程序会向编辑控件发送一条消息,指示它选择控件中的文本,以便用户可以轻松地替换它。如果GetDlgItemInt不返回错误,则该过程可以自己执行所请求的命令,也可以向所有者窗口发送消息,指示执行命令。