class MyApp : public CWinApp {
afx_msg OnPrefrences();
};
当用户从菜单栏中选择工具->首选项时,将调用OnPrefrences()。
现在,在一个对话框(说DlgX)中有一个按钮,单击此按钮后,我需要打开实际上有很多窗格的“首选项”对话框,但是在这里,我需要通过选择这些窗格中的一个作为活动窗口来打开“首选项”对话框。同样,在该特定窗格中,仅当通过此对话框而不是通过菜单打开对话框时,才需要隐藏某些控件。
所以我在MainFrm类中创建了一个变量(说m_varX)。
void DlgX::OnButtonXClick()
{
CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
if(pFrame)
{
pFrame->m_varX = TRUE;
((CMyApp*)(AfxGetApp()))->OnPrefrences();
pFrame->m_varX = FALSE;
}
}
在DlgX的按钮处理程序中,我将此m_varX设置为TRUE并调用OnPreference(),在关闭此首选项对话框后,我将m_varX设置为FALSE。
所有这些都工作正常……但是问题是mainFrm中的事情变得混乱了。另外,我正在从事的项目是旧项目,因此我无法进行太多更改。
是否有任何可用于处理此类情况的模式?
谢谢
最佳答案
您可以通过自定义对话框解决此问题(如果您还没有的话)
当您从主菜单显示对话框时,即onPreferences(),您将填写并显示所有“窗格”。您将必须执行一个自定义对话框,其中ctor会接受一些参数
例如
enum { all, part };
void MainFrame::OnPreferences()
{
CMyPreferences dlg( GetDocument(), all );
dlg.DoModal();
}
但是当您在对话框中调用它时,只需填写所需的部分。
void YourDialog::OnPreferences()
{
CMyPreferences dlg( GetDocument(), part );
dlg.doModal();
}
对于显示/允许编辑的内容的微调配置,该参数可能更复杂。