本文介绍如何在无模式的CPropertySheet对象中实现标准的确定、取消和应用按钮。
我们知道,在MFC中,如果是普通的Dialog,模态显示使用DoModal,非模态显示就稍微麻烦一些:
CSampleDlg *dlg = new CSampleDlg(IDD_SAMPLE_DLG);
if(NULL == dlg)
return;
dlg->Create(this);
if(dlg->GetSafeHWnd() == NULL)
return;
dlg->ShowWindow(SW_NORMAL);
销毁:
dlg->DestroyWindow();
delete dlg;
dlg = NULL;
但是CPropertySheet如果采用类似的方法创建非模态显示,是无法显示出下方的标准按钮的:Apply/OK/Cancel
可以通过这种方法解决:
对于无模式CPropertySheet,Microsoft 基础类 (MFC) 调整表的大小,并隐藏中的CPropertySheet::OnInitDialog成员函数的标准按钮。若要防止 MFC 执行此操作,请执行以下步骤:
从CPropertySheet派生类和重写OnInitDialog函数。
设置为 FALSE 时"m_bModeless",并删除"m_nFlags"的 WF_CONTINUEMODAL 样式。
调用CPropertySheet::OnInitDialog
将"m_bModeless"重新设置为 TRUE,并将 WF_CONTINUEMODAL 的样式添加到"m_nFlags"。
下面的代码示例阐释了这种技术:
// CMySheet is derived from CpropertySheet.
// Compile options needed: default.
BOOL CMySheet::OnInitDialog()
{
m_bModeless = FALSE;
m_nFlags |= WF_CONTINUEMODAL;
BOOL bResult = CPropertySheet::OnInitDialog();
m_bModeless = TRUE;
m_nFlags &= ~WF_CONTINUEMODAL;
return bResult;
}
无模式的CPropertySheet对象中的确定和取消按钮不关闭属性表在被单击时。他们不要向工作表中,发送 WM_COMMAND 消息来使用 IDOK 或 IDCANCEL, OnOK或OnCancel函数调用的页。若要关闭该工作表,可以为 IDOK 和CPropertySheet中的 IDCANCEL 实现 ON_COMMAND 处理程序,并调用EndDialog函数,以关闭表。