在MFC(Microsoft Foundation Classes)应用程序中,创建一个具有层次结构的偏好设置对话框是一个常见的需求。这种对话框允许用户通过一个树形控件(CTreeCtrl)浏览不同的设置页面。本文将指导如何使用CTreeCtrl和CDialog类来实现这一功能。
在开始之前,需要确保项目中包含了必要的文件和资源。以下是需要添加到项目中的文件:
CSAPrefsDialog.cpp
, CSAPrefsDialog.h
CSAPrefsSubDlg.cpp
, CSAPrefsSubDlg.h
CSAPrefsStatic.cpp
, CSAPrefsStatic.h
此外,还需要从示例项目中复制IDD_SAPREFS对话框资源到项目中。
使用资源编辑器创建偏好设置页面,并设置以下属性:
使用类向导为这些页面创建对话框类。
在新对话框类的.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
来说,所有页面都是平等的,彼此独立。
OnOK
和OnCancel
是CSAPrefsSubDlg
的虚函数。可以在自己的派生对话框中重写它们。但是,需要手动实现它们(像实现其他函数一样)。类向导无法为完成这个操作。当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);
}