加入项目
举例如下:
1.在项目中加入MFC类CMyMainSheet,选择CPropertySheet作为其基类。
2.在项目中加入MFC类CMyPage1,CMyPage2,选择CPropertyPage作为基类,它们将作为属性对话框中的属性页。
弹出属性对话框
实现:
void PopupPropertyDlg()
// 创建PropertySheet和PropertyPage
CMyMainSheet mms(_T("MainSheet"), this);
CMyPage1 mp1;
CMyPage2 mp2;
// 如果想要去掉“应用”和“帮助”按钮
mms.m_psh.dwFlags |= PSH_NOAPPLYNOW;
mms.m_psh.dwFlags &= ~PSH_HASHELP;
mp1.m_psp.dwFlags &= ~PSP_HASHELP;
mp2.m_psp.dwFlags &= ~PSP_HASHELP;
// 设置各个属性页中元素的初值
mp1.m_xxxx = ;
mp2.m_xxxx = ;
// 弹出对话框
mms.AddPage(&mp1);
mms.AddPage(&mp2);
if(mms.DoModal() == IDOK)
// 如果确定了,采取的操作
// 注意,当执行到上面的代码时,UpdateData(True)已经被自动执行
PropertySheet中各种元素之间的交互
在复杂的对话框中,常常有这样的情况发生:当修改某一个PropertyPage中的控件时,该元素的值会影响属性页中其他控件,甚至是其他属性页中的控件的属性。如果通过直接发消息等方法来处理,这样的处理逻辑会遍布各个属性页,降低代码的可读和可修改性。我们采用PropertySheet作为中介者,这样的消息全部发送给PropertySheet,然后由它对涉及的PropertyPage中的控件进行处理。
比如,在mp1控件的Edit中是否填入值要影响mp2中Edit控件的Enable/Disable,我们可以这样做:
CMyPage1中加入消息响应函数,用于接收Edit控件的修改事件
OnEnChangeEdit()
调用PropertySheet的处理函数,而不是自己来处理
CMyMainSheet* pmms = NULL;
pmms = (CMyMainSheet*)GetParent();
pmms->EnableSwitch();
CMyMainSheet中加入处理函数
EnableSwitch
判断mp1中控件的值,来确定mp2中控件的Enable/Disable
CString str1;
GetPage(0)->GetDlgItemText(IDC_EDIT1, str1);
if(_T("") == str1)
GetPage(1)->GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
else
GetPage(1)->GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE);