VC属性表的实现有2种方法:
1,通过CTabCtrl控件实现属性页功能
2,通过CPropertySheet和CPropertyPage类来实现
下面分别简单介绍一下这两种方法的实现:
1,通过CTabCtrl控件实现属性页功能
1)、建立一个基于对话框的应用程序;
2)、画CTabCtrl控件,addclass,类向导中关联变量名为m_tab,新建三个对话框属性设为style:Child, border:None,用ClassWizard生成新的类,基类为Cdialog,分别为Cpage0,Cpage1,Cpage2,ID号分别为IDD_DIALOG0,IDD_DIALOG1,IDD_DIALOG2。在主对话框中加入三个变量,Cpage0 page0;Cpage1 page1;Cpage2 page2。别忘了在主对话框的头文件中要加入#include "Page0.h",#include "Page1.h",#include "Page2.h"
3)、在主对话框的OnInitDialog()内初始化 :
// TODO: Add extra initialization here
//初始化m_tab控件
m_tab.InsertItem(0,_T("first sheet"));
m_tab.InsertItem(1,_T("second sheet"));
m_tab.InsertItem(2,_T("third sheet "));
//建立属性页各页
page0.Create(IDD_DIALOG0,GetDlgItem(IDC_TAB1));
page1.Create(IDD_DIALOG1,GetDlgItem(IDC_TAB1));
page2.Create(IDD_DIALOG2,GetDlgItem(IDC_TAB1));
//设置页面的位置在m_tab控件范围内
CRect rect;
m_tab.GetClientRect(&rect);
rect.top+=20;
rect.bottom-=4;
rect.left+=4;
rect.right-=4;
page0.MoveWindow(&rect);
page1.MoveWindow(&rect);
page2.MoveWindow(&rect);
page1.ShowWindow(TRUE);
m_tab.SetCurSel(1);
至此,初始化完成,下面添加CTabCtrl控件的通知事件和处理函数.
4)、add event handler.选择TCN_SELCHANGE消息,函数修改如下:
//m_tab控件属性页选择时显示各页
void CMy3Dlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int CurSel;
CurSel=m_tab.GetCurSel();
switch(CurSel)
{
case 0:
page0.ShowWindow(TRUE);
page1.ShowWindow(FALSE);
page2.ShowWindow(FALSE);
break;
case 1:
page0.ShowWindow(FALSE);
page1.ShowWindow(TRUE);
page2.ShowWindow(FALSE);
break;
case 2:
page0.ShowWindow(FALSE);
page1.ShowWindow(FALSE);
page2.ShowWindow(TRUE);
break;
default: ;
}
*pResult = 0;
}
2,通过CPropertySheet和CPropertyPage类来实现(根据新建立的MFC模板对话框程序来修改.)
1) 新建2个对话框IDD_DIALOG1和IDD_DIALOG2,在上面随便放点什么控件之类的;
2) 用向导为它们添加类CPage1和CPage2,基类都是CPropertyPage.同时自动创建.cpp和.h文件
3) 用向导添加新类CProSheet,基类为CPropertySheet,同时自动创建ProSheet.h和ProSheet.cpp.
4) 在ProSheet.h中定义
#include "Page1.h"
#include "Page2.h"
class CProSheet : public CPropertySheet
{
.......
public:
CPage1 m_page1;//
CPage2 m_page2;//
}
5) 在CProSheet.cpp里两个构造函数处添加:
//CProSheet.cpp
CProSheet::CProSheet()
{
AddPage(&m_page1);
AddPage(&m_page2);
}
CProSheet::CProSheet()
{
AddPage(&m_page1);
AddPage(&m_page2);
}
6) 好了,现在可以在你想调用的地方调用这个属性页了:比如你想在C***::Fun()里调用,就在C***.cpp的顶部加入#include "ProSheet.h",然后
void C***::Fun()
{
CProSheet proSheet("属性页测试",this,0);
proSheet.DoModal();
}这样,你调用Fun()的时候就可以看到效果了.
同样,如果想在主程序开始的时候,就调用,可以在xxapp.c中的InitInstance()函数下调用:
BOOL xxApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
allsheet allcontrolssheet(_T("NIC Utility"));
m_pMainWnd = &allcontrolssheet;
allcontrolssheet.DoModal();
return FALSE;
}
这样主对话框的类就可以删除了.而直接调用属性表.