一,创建
首先在ResourceView中添加Dialog。选中Dialog,右键打开菜单,选择Inert,然后选择Dialog中的IDD_PROPPAGE。在此创建三个Dialog,并为其建立相应的类Cpage1、Cpage2、Cpage3。
然后在ClassView中为整个项目添加新类Cprosheet,基类为CPropertySheet。然后将Cpage1、Cpage2、Cpage3的三个Dialog添加到Cprosheet中就可实现多个选项卡的对话框。
添加方法如下:
(1)先在Cprosheet类中添加Cpage1、Cpage2、Cpage3的三个全局变量
public:
Cpage1 m_page1;
Cpage2 m_page2;
Cpage3 m_page3;
(2)在Cprosheet类的构建函数中添加三个对话框
Cprosheet::Cprosheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
AddPage(&m_page3);
}
二,PropertySheet显示
关于Cprosheet对话框的显示有两种方法,一种为DoModal,另一种为ShowWindow。前一种的显示代码如下:
Cprosheet property ("test",this,NULL);
Property. DoModal();
后一种的显示代码如下:
CPropertySheet *property=new Cprosheet("test",this,NULL);
property->Create(this, WS_TILEDWINDOW, WS_EX_TOPMOST);
property->ShowWindow(SW_SHOW);
至于两种显示方法显示的对话框的区别我就不说了,相信大家比我都了解。
值得一提的是DoModal显示出来的对话框自带“确定”(IDOK)、“取消”(IDCANCEL)等按钮,而ShowWindow显示的对话框是不带这些按钮的。如果想先显示这些按钮,就需要修改Cprosheet的初始化函数OnInitDialog(),代码如下:
m_bModeless = FALSE;
m_nFlags |= WF_CONTINUEMODAL;
BOOL bResult = CPropertySheet::OnInitDialog();
// TODO: Add your specialized code here
m_bModeless = TRUE;
m_nFlags &= ~WF_CONTINUEMODAL;
return bResult;
另外,如果不想要某些按钮的话,可以用以下方法:
CWnd *hWnd = GetDlgItem(IDCANCEL);
hWnd->ShowWindow(false); //隐藏“取消”(IDCANCEL)按钮
如果想修改按钮的文字可用以下方法:
CWnd *hWnd = GetDlgItem(IDOK);
hWnd->SetWindowText(_T("按钮1")); //修改“确定”(IDOK)按钮名称
三,添加按钮功能
下面简单介绍一下修改“确定”、“取消”等按钮功能的方法。
修改这些按钮的功能,首先要先声明要添加的功能函数OnOk和OnCancel。在Cprosheet的头文件中Operations中添加afx_msg void OnOk()和afx_msg void OnCancel()两句代码。如下:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(Cprosheet)
public:
virtual BOOL ContinueModal();
virtual BOOL OnInitDialog();
protected:
virtual void DoDataExchange(CDataExchange* pDX);
virtual void CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType = adjustBorder);
virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
//}}AFX_VIRTUAL
afx_msg void OnOk();
afx_msg void OnCancel();
然后要将按钮ID与函数对应起来。在Cprosheet类中找到如下代码
BEGIN_MESSAGE_MAP(Cprosheet, CPropertySheet)
//{{AFX_MSG_MAP(Cprosheet)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
在其中添加
ON_BN_CLICKED(IDOK, OnOk) // IDOK对应 OnOk函数
ON_BN_CLICKED(IDCANCEL,OnCancel) // IDCANCEL对应 OnCancel函数
这样就可在void Cprosheet::OnOk()和void Cprosheet::OnCancel()种修改功能代码了。
四,选项卡动态更新
在按照以上方法创建的选项卡,我在使用中发现选项卡的内容更新总是不能实时更新。下面的方法是我解决此问题的办法。
(1)首先在项目的APP类(我的为CPagesheetApp)中声明全局变量
int pageflag; //判断显示为哪一页
(2)然后在Cpage1、Cpage2、Cpage3的初始化函数OnInitDialog中更改pageflag的值,用来表示当前为哪一个page。
比如在Cpage1这样赋值
((CPagesheetApp*)AfxGetApp())->pageflag=1;
对于Cpage2 和Cpage3分别赋值为2和3。
(3)在Cprosheet中声明全局变量NUM,NUM1,NUM2,并均赋值为0。最后在OnOk函数种添加如下代码
m_page1.UpdateData(true);
if(NUM1==0)
{
if(((CPagesheetApp*)AfxGetApp())->pageflag==2)
{m_page2.UpdateData(true);
NUM1=1;
}
}
else {m_page2.UpdateData(true);}
if(NUM2==0)
{
if(((CPagesheetApp*)AfxGetApp())->pageflag==3)
{ m_page3.UpdateData(true);
NUM2=1;
}
}
else {m_page3.UpdateData(true);}
NUM++;
这样问题就基本解决了。
本文详细介绍了如何使用VC++6.0的CPropertySheet和IDD_PROPPAGE来创建多选项卡对话框。通过创建Cpage1、Cpage2、Cpage3三个Dialog类并添加到Cprosheet中,实现选项卡切换。同时讲解了DoModal和ShowWindow两种显示方式的区别,以及如何自定义按钮功能和实现选项卡内容的动态更新。
&spm=1001.2101.3001.5002&articleId=4236913&d=1&t=3&u=e4bd295079d843c5a6350bfac3bdbdd4)
3581

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



