参考:
http://blog.youkuaiyun.com/system14/article/details/9620999
http://blog.youkuaiyun.com/foreverhuylee/article/details/23450639
http://bbs.youkuaiyun.com/topics/50029048
CPropertyPage 是一个从CDialog派生而来的一个类,基本功能与对话框类一样,
CPropertySheet不是一个CDialog的派生类,他是派生自CWnd的,其实它就是一个CDialog上加了一个CTabCtrl的组合类
a.新建一个MFC工程navigation
b.插入两个Dialog资源,Caption改为A,B
c.分别为两个Dialog绑定CPropertyPage类 ,命名CPageA,CPageB
d.使用Class Wizard新建一个MFC类,名字CMSheet,父类CPropertySheet
e.在CMSheet中添加
//.h
CPageA* pageA;
CPageB* pageB;
================================
//.cpp
CMSheet::CMSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage) {
pageA = new CPageA();
pageB = new CPageB();
AddPage(pageA);
AddPage(pageB);
SetActivePage(iSelectPage);
SetWizardMode(); //指定为导向页面,不这样指定默认把虽偶有页面放在一起变成tab标签形式的了
}
CMSheet::CMSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
: CPropertySheet(pszCaption, pParentWnd, iSelectPage) {
pageA = new CPageA();
pageB = new CPageB();
AddPage(pageA);
AddPage(pageB);
SetActivePage(iSelectPage);
SetWizardMode(); //指定为导向页面,不这样指定默认把虽偶有页面放在一起变成tab标签形式的了
}
CMSheet::~CMSheet() {
if(pageA) {
delete pageA;
}
if(pageB) {
delete pageB;
}
}f.在navigation的初始化函数中添加
CMSheet wizard(L"Register Wizard Page", this, 0);
wizard.DoModal();g.在CPageA, CPageB中,需要的地方重载
virtual BOOL OnInitDialog();//只执行一次,back时不调用
virtual LRESULT OnWizardBack();
virtual BOOL OnWizardFinish();
virtual LRESULT OnWizardNext();
virtual BOOL OnSetActive();//当该页面成为活动页面时被调用,可以执行多次
//CPageA.cpp
BOOL CPageA::OnSetActive() {
CPropertySheet* psheet = (CPropertySheet*)GetParent();
psheet->SetWizardButtons(PSWIZB_NEXT);
return CPropertyPage::OnSetActive();
}
//CPageB.cpp
BOOL CPageB::OnSetActive() {
CPropertySheet* psheet = (CPropertySheet*)GetParent();
psheet->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);
return CPropertyPage::OnSetActive();
}h.去除cancel和help按钮,在CMSheet的初始化中添加
CWnd *pWnd = GetDlgItem(IDCANCEL);
pWnd->ShowWindow(FALSE);
pWnd = GetDlgItem(IDHELP);
pWnd->ShowWindow(FALSE);i.对于按钮位置和大小的调整,查看别处(o_O)
j.设置打开软件就进入导航界面
在Navigation.cpp中
#include"NavigationDlg.h" 改为 #include"MSheet.h"
CNavigationDlg dlg 改为 CMSheet dlg(L"Register Wizard Page", NULL, 0)
k.隐藏分割线下的所有东西,在CMSheet的初始化中添加
RECT rect;
GetWindowRect(&rect);
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
SetWindowPos(NULL, 0, 0, width, height * 0.9, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);// * 0.9 这个参数根据自己的界面改值
这篇博客介绍了如何在MFC环境中构建一个导航界面。通过步骤a到k详细阐述了如何从新建工程开始,添加对话框资源,创建CPropertyPage和CPropertySheet类的派生类,重载相关函数以实现页面间的导航逻辑,并最终设置启动时显示导航界面。涉及到的关键技术包括CPropertyPage和CPropertySheet的使用,以及MFC类的继承和事件处理。
844

被折叠的 条评论
为什么被折叠?



