无模式对话框应该是一个弹出窗口,其中有一个系统菜单,一个标题栏和一个细边框;也就是说,对话框模板应该指定WS_POPUP,WS_CAPTION,WS_BORDER和WS_SYSMENU样式。除非模板指定WS_VISIBLE样式,否则Windows会【不】自动显示该对话框。
应用程序使用CreateDialog或CreateDialogIndirect功能创建无模式对话框。CreateDialog需要包含对话框模板的资源的名称或标识符; CreateDialogIndirect需要包含对话框模板的内存对象的句柄。另外两个功能CreateDialogParam和CreateDialogIndirectParam也创建了无模式对话框;当创建对话框时,他们将指定的参数传递给对话框过程。
CreateDialog和其他创建函数返回对话框的窗口句柄。应用程序和对话框过程可以使用此句柄来管理对话框。例如,如果在对话框模板中未指定WS_VISIBLE,则应用程序可以通过将窗口句柄传递给ShowWindow函数来显示对话框。
无模式对话框既不会禁用所有者窗口也不会向其发送消息。创建对话框时,Windows将使其成为活动窗口,但用户或应用程序可以随时更改活动窗口。如果对话框确实变得不活动,即使所有者窗口处于活动状态,它仍然以Z顺序位于所有者窗口的上方。
应用程序负责检索和调度输入消息到对话框。大多数应用程序使用主消息循环。然而,为了允许用户使用键盘移动并选择控件,应用程序必须调用IsDialogMessage功能。有关此函数的详细信息,请参阅对话框键盘界面.
无模式对话框不能作为模态对话框返回值到应用程序,但对话框过程可以使用SendMessage函数向所有者窗口发送信息。
应用程序必须在终止前销毁所有无模式对话框。它可以通过使用DestroyWindow功能来销毁无模式对话框。在大多数情况下,响应用户输入,例如选择取消按钮,对话框过程调用DestroyWindow.如果用户从不以这种方式关闭对话框,应用程序必须调用DestroyWindow.
DestroyWindow使对话框的窗口句柄无效,因此对使用句柄的函数的任何后续调用返回错误值。为防止错误,对话框过程应通知所有者该对话框已被销毁。许多应用程序维护包含对话框的句柄的全局变量。当对话框过程销毁对话框时,它还将全局变量设置为NULL,表示对话框不再有效。
对话框过程不得调用EndDialog函数来销毁无模式对话框。