MODELESS 示例:将 CDialog 对象用作无模式对话框

更新:2007 年 11 月

MODELESS 示例阐释如何将 MFC CDialog 对象用作无模式对话框。MODELESS 是一个基于对话框的简单应用程序,它在主对话框中管理列表框,同时提供无模式对话框以允许向主窗口中的列表框添加字符串。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行 MODELESS 示例

  1. 打开解决方案 modeless.sln。

  2. 在“生成”菜单中单击“生成”。

  3. 在“调试”菜单中,单击“开始执行(不调试)”。

此示例启动时,它显示一个空列表框。您可以通过单击“添加”打开无模式对话框。即使在“Modeless Adder”对话框处于打开状态时,也可以将焦点移回到主对话框。当无模式对话框打开时,主对话框上的“Add”按钮不可用,这样用户就无法创建无模式对话框的多个实例。

主对话框的 CMainDlg 类管理指向无模式对话框的指针。它这样做只是为了方便;创建了无模式对话框后,不需要对其进行进一步管理。在应用程序中,可以选择提供无模式对话框信息,而该指针可提供对管理此对话框的 C++ 对象的访问,因此它是一个非常好的起始点。

主对话框中“Add”按钮的代码使用 Create 函数(而不是调用 DoModal)创建无模式对话框。正是这使得该对话框无模式;Windows 以不同的方式处理该对话框的消息。当该对话框被销毁时,不使用 EndDialog;而是调用 DestroyWindow。由于 CDialog 对象的普通 OnOkOnCancel 成员函数将调用 EndDialog,请确保无模式对话框不会调用那些函数,而是重写它们以调用 DestroyWindow

通常,创建有模式对话框时,在 DoModal 返回后手动将其销毁。由于无法在显示无模式对话框的同时等待 Create 返回,因此需要有其他一些机制来销毁同窗口关联的 C++ 对象。此示例使用一种非常简单的机制:它在 PostNcDestroy 中执行 delete this (一个在对话框的非工作区被销毁后调用的函数)。

请注意,无模式对话框以两种不同的方式与它的父对话框通信。首先,当用户按“确定”时,无模式对话框中的编辑控件字符串会添加到有模式对话框的列表框内容中。其次,当用户以任何方式销毁窗口时,无模式对话框调用有模式窗口中的 BoxDone 函数。此函数仅重置指向有模式对话框的指针并重新启用“Add”按钮。

关键字

此示例说明以下关键字:

AfxGetApp;CDC::DrawIcon;CDC::GetSafeHdc;CDialog::Create;CDialog::DoModal;CDialog::OnCancel;CDialog::OnOK;CListBox::AddString;CMenu::AppendMenu;CMenu::ModifyMenu;CRect::Height;CRect::Width;CString::IsEmpty;CString::LoadString;CWinApp::InitInstance;CWinApp::LoadStdProfileSettings;CWnd::DestroyWindow;CWnd::DoDataExchange;CWnd::EnableWindow;CWnd::GetClientRect;CWnd::GetDlgItem;CWnd::GetWindowText;CWnd::IsIconic;CWnd::OnPaint;CWnd::OnQueryDragIcon;CWnd::OnSysCommand;CWnd::PostNcDestroy;CWnd::SendMessage;CWnd::SetActiveWindow;GetSystemMenu;GetSystemMetrics;LoadIcon

说明:

某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。

请参见

其他资源

MFC 示例