热度 1||
网上的wizard对话框都是使用Domodel的模态对话框.要想改成modelless颇费一番周折.
下面我要慢慢介绍如何制作一个非模态对话框.
这里先提一下我遇到的问题:
由于堆和栈的不同.使用 非new的页加载到非模态向导框里面会报错!
下面慢慢说明如何添加:
1.新建一个class (MFC类)名字为:Wizard,然后基类选择CPropertySheet;
在Wizard类中,我们需要处理取消,完成和帮助.我现在没有找到帮助键的禁用方法.暂且
不管.过滤一下.
在Wizard里重载OnCmdMsg;如下:
virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo);
cpp:
BOOL CWizard::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
//上一步12323,下一步12324,完成12325,取消2,帮助9
if ((nID == 12325) || (nID == 2))
{
this->ShowWindow(SW_HIDE);
return TRUE;
}
if (nID == 9)
{
MessageBoxA("WIZARD","WIZARD",MB_OK);
return TRUE;
}
return FALSE;
}
下面还要设计一个页类,用于创建所有每一步的页.
这里只贴出第一步.
新建一个对话框,命名为IDD_STEP1
新建一个类CStep,基类是CPropertyPage,对话框ID:IDD_STEP1;
这样,在主程序里添加如下代码即可实现非模态Wizard.
注意要包含对应头文件.把声明放在类里面,用于销毁.否则会导致内存泄漏
CWizard *pWizard = new CWizard("WIZARD");
CStep1 *pStep1 = new CStep1();
pWizard->AddPage(pStep1);
pWizard->SetWizardMode();
pWizard->SetActivePage(pStep1);
pWizard->Create();
pWizard->ShowWindow(SW_SHOW);