创建自定义偏好设置对话框

在MFC(Microsoft Foundation Classes)应用程序中,创建一个具有层次结构的偏好设置对话框是一个常见的需求。这种对话框允许用户通过一个树形控件(CTreeCtrl)浏览不同的设置页面。本文将指导如何使用CTreeCtrl和CDialog类来实现这一功能。

准备工作

在开始之前,需要确保项目中包含了必要的文件和资源。以下是需要添加到项目中的文件:

  • CSAPrefsDialog.cpp, CSAPrefsDialog.h
  • CSAPrefsSubDlg.cpp, CSAPrefsSubDlg.h
  • CSAPrefsStatic.cpp, CSAPrefsStatic.h

此外,还需要从示例项目中复制IDD_SAPREFS对话框资源到项目中。

创建偏好设置页面

使用资源编辑器创建偏好设置页面,并设置以下属性:

  • 样式 - 子窗口
  • 边框 - 无
  • 不包含“确定”或“取消”按钮(这些页面类似于CPropertyPages)

使用类向导为这些页面创建对话框类。

修改对话框类

在新对话框类的.cpp和.h文件中,将所有CDialog的实例替换为CSAPrefsSubDlg。需要包含头文件#include "SAPrefsSubDlg.h"

创建主对话框并添加页面

以下是创建主对话框并添加页面的示例代码:

// 偏好设置对话框 CSAPrefsDialog dlg; // 页面(所有页面都派生自CSAPrefsSubDlg) CPage1 page1; CPage2 page2; CPage3 page3; CPage4 page4; // 添加3个页面 dlg.AddPage(page1, "页面 1"); dlg.AddPage(page2, "页面 2"); dlg.AddPage(page3, "页面 3"); // 这个页面将是树的一个子节点 dlg.AddPage(page4, "页面 4", &page3); // 偏好设置对话框的标题 dlg.SetTitle("这是一个漂亮的"); // 在阴影页面标签右侧绘制的文本。当页面更改时,这个文本不会改变,因此是"常量"。 dlg.SetConstantText("SAPrefs"); // 像其他对话框一样启动它... if (dlg.DoModal() == IDOK) { m_csStupidCString = dlg1.m_csText; }

处理父子关系

使用AddPage(page, text, &parent)指定的父子关系完全是装饰性的。只有树控件知道它们!对于CSAPrefsDialog来说,所有页面都是平等的,彼此独立。

处理OK和Cancel

OnOKOnCancelCSAPrefsSubDlg的虚函数。可以在自己的派生对话框中重写它们。但是,需要手动实现它们(像实现其他函数一样)。类向导无法为完成这个操作。当CSAPrefsSubDlg通过OK或Cancel关闭时,这些函数会被调用,对于每个已经查看过的页面。

处理帮助

应该像处理CPropertyPage一样处理帮助:使用WM_NOTIFY消息处理器:

BOOL CMyPage::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { NMHDR* pnmh = (LPNMHDR) lParam; if (pnmh->code == PSN_HELP) { AfxGetApp()->WinHelp(some help ID); } return CSAPrefsSubDlg::OnNotify(wParam, lParam, pResult); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485