CSettingsDialog,一个自定义您的项目设置等的对话框






4.86/5 (13投票s)
2002 年 2 月 14 日
3分钟阅读

307198

5983
类似 Netscape 偏好设置的对话框
引言
本文扩展了 Chris Losinger 在 CSAPrefsDlg 上的工作。
CSettingsDialog
是一个 MFC 类,可以自定义项目设置。 项目的设置根据其性质被分类为页面。 如果您熟悉 Netscape 首选项对话框,您将不会理解 CSettingsDialog
的界面。
与 CodeProject 和 CodeGuru 中发布的类似对话框不同,它们只允许一种类型的窗口(例如,CPropertyPage
或 CDialog),CSettingsDialog
允许任何 CWnd
派生的窗口用作设置页面(看看上面的演示图,属性页,表单视图和一个通用的 CWnd
Windows 用于不同的设置。我相信这种设计扩展了类的适用性,以满足各种情况的需要。 此外,每个树节点不必具有要关联的设置页面,它可以是通用树节点,例如,用作类别索引的标签。
此最新版本中添加了新功能。 支持 CHtmlView
(看看第一张演示图片)。 但是,为了使用 CHtmlView
(或派生) 类,您需要重写 OnMouseActive
虚拟函数,以避免在您的 CHtmlView
(或派生) 类中出现 ASSERT
错误。 CSettingsDialog
的另一个新功能是它支持模态和非模态显示状态。 有一些规则需要遵循。 对于非模态对话框,对话框变量必须声明为指针,并使用 new
运算符实例化。 您需要使用成员函数 CSettingsDialog::Create()
创建对话框,并使用 ShowWindow(SW_SHOW)
显示对话框。 对话框中的“应用”按钮在模态状态下被禁用,在非模态状态下被启用。
如何使用 CSettingsDialog
该类的使用非常简单。 只需按照以下步骤操作- 将以下文件添加到您的项目中
- SettingsDialog.cpp, SettingsDialog.h
- CSAPrefsStatic.cpp,.h
- 将
IDD_SETTINGS_DLG
对话框资源从示例项目复制到您的项目。 - 在资源编辑器中创建您的设置“页面”。 如果页面是对话框,请确保该对话框具有以下设置
- 样式 - 子窗口
- 边框 - 无
- 没有
OK
或Cancel
按钮!
- 如果用作模态对话框:如演示项目所示,创建并初始化
CSettingsDialog
:CSettingsDialog dlg;CSettingsDialog dlg; dlg.AddPage(RUNTIME_CLASS(CMyHtmlView), _T("Project Setting"), 0); CPropPage1 *pModelPage = (CPropPage1*) dlg.AddPage(RUNTIME_CLASS(CPropPage1), _T("Model"), IDD_PROPERTY_PAGE1, _T("Project Setting")); dlg.AddPage(RUNTIME_CLASS(CPropPage2), _T("Visibility"), IDD_PROPERTY_PAGE2, pModelPage); dlg.AddPage(RUNTIME_CLASS(CMyFormView), _T("Form View"), IDD_FORMVIEW, pModelPage); dlg.AddPage(RUNTIME_CLASS(CMyView), _T("Generic View Page"), 0); dlg.AddPage(NULL, _T("Generic Tree Item"), 0); dlg.SetTitle("Project Settings"); dlg.SetLogoText("CSettingsDialog 1.0"); int nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: Place code here to handle when the dialog is // dismissed with OK } else if (nResponse == IDCANCEL) { // TODO: Place code here to handle when the dialog is // dismissed with Cancel }
- 如果用作非模态对话框
- 在您的父窗口类中将
CSettingsDialog
变量声明为指针,例如,CMainFrame
中的m_pDlg
。 - 实例化一个
CSettingsDialog
对象CSettingsDialog *m_pDlg = new CSettingsDialog(this) ;
- 创建、初始化和显示设置页面和对话框,例如,
if (!m_pDlg) { m_pDlg = new CSettingsDialog(this); m_pDlg->AddPage(RUNTIME_CLASS(CMyHtmlView), _T("Project Setting"), 0); CPropPage1 *pModelPage = (CPropPage1*) m_pDlg->AddPage(RUNTIME_CLASS(CPropPage1), _T("Model (PropertyPage)"), IDD_PROPERTY_PAGE1, _T("Project Setting")); m_pDlg->AddPage(RUNTIME_CLASS(CPropPage2), _T("Visibility (PropertyPage)"), IDD_PROPERTY_PAGE2, pModelPage); m_pDlg->AddPage(RUNTIME_CLASS(CMyFormView), _T("Form View"), IDD_FORMVIEW, pModelPage); m_pDlg->AddPage(RUNTIME_CLASS(CMyView), _T("Generic View Page"), 0); m_pDlg->AddPage(NULL, _T("Generic Tree Item"), 0); m_pDlg->SetTitle("Project Settings"); m_pDlg->SetLogoText("CSettingsDialog 1.0"); m_pDlg->Create(); } m_pDlg->ShowWindow(SW_SHOW);
- 在“拥有”对话框的父窗口中添加
CSettingsDialog
的消息处理程序。 - 最后不要忘记在父窗口的析构函数中释放对话框内存。
- 如果您不确定如何操作,请查看附加的演示项目,
- 在您的父窗口类中将
致谢
- Chris Losinger 为他的 CSAPrefsDialog (我修改自)和 CSAPrefsStatic (我直接使用) 类
历史
- V1.0 02/12/02 类的第一个版本
- V1.1 03/01/02
- 修复了内存泄漏错误。
- 删除了 CView 类型类(包括 CFormView)的粗边框样式,使其看起来更符合行业标准。
- 支持 Html 视图。
- V1.2 03/08/02 支持模态和非模态状态。 演示项目以模态和非模态方式显示 CSettingsDialog。