在资源编辑器设置了属性页之后,就可以通过ClassWizard创建一个CPropertyPage派生类了,其方式与创建CDialog派生类非常相似,惟一的区别在于不是选择CDialog而是选择 CPropertyPage作为基类。为了创建和显示一个模态属性单,通常会在栈上声明一个CPropertySheet对象,并调用其DoModal函数(就像CDialog对象所做的那样)。但是,对于属性页则需要在调用属性单的DoModal函数之前给属性单添加相应的属性页: protected:
CPropertySheet m_sheet;
CMyPropertyPage1 m_pageMyPage1; //CMyPropertyPage1是自己声明的基于CPropertyPage的类
然后再在OnInitDialog()函数中调用
sheet.AddPage(&m_pageMyPage1);
sheet.DoModal();
显示无模态属性单和显示模态属性单的方法基本相同,主要差别在于不是使用DoModal()函数,而是使用CPropertySheet::Create()函数显示属性单。但是要注意:在负责显示属性单的函数内,检查属性单的HWND成员变量,确定是否已经创建了该属性单,如果还没有创建该属性单,则实例化各页面对象,通过AddPage把他们添加到属性单中,然后再调用Create显示该属性单;如果已经构造了属性单,则调用BringWindowToTop()函数就能很容易的找的袄属性单了,代码如下:
HWND hwnd = g_sheet.GetSafeHwnd();
if (!hwnd)
{
CPropPage1* p1 = new CPropPage1();
CPropPage2* p2 = new CPropPage2();
sheet.AddPage(p1);
sheet.Create();
}
else
{
sheet.BringWindowToTop();
}
当要从内存中清除这些页面是可以重载属性单类的PostNcDestroy()虚函数:
PostNcDestroy()
{
int nPages = GetPageCount();
for (int i = (nPages - 1); i >= 0; i--)
{
CPropertyPage* pPage = GetPage(i);
ASSERT(pPage);
if (pPage)
{
delete pPage;
RemovePage(i);
TRACE("[CMyPropertySheet::OnDestroy] Removing page %ld/n", i);
}
}
CPropertySheet::PostNcDestroy();
}
CPropertySheet m_sheet;
CMyPropertyPage1 m_pageMyPage1; //CMyPropertyPage1是自己声明的基于CPropertyPage的类
然后再在OnInitDialog()函数中调用
sheet.AddPage(&m_pageMyPage1);
sheet.DoModal();
显示无模态属性单和显示模态属性单的方法基本相同,主要差别在于不是使用DoModal()函数,而是使用CPropertySheet::Create()函数显示属性单。但是要注意:在负责显示属性单的函数内,检查属性单的HWND成员变量,确定是否已经创建了该属性单,如果还没有创建该属性单,则实例化各页面对象,通过AddPage把他们添加到属性单中,然后再调用Create显示该属性单;如果已经构造了属性单,则调用BringWindowToTop()函数就能很容易的找的袄属性单了,代码如下:
HWND hwnd = g_sheet.GetSafeHwnd();
if (!hwnd)
{
CPropPage1* p1 = new CPropPage1();
CPropPage2* p2 = new CPropPage2();
sheet.AddPage(p1);
sheet.Create();
}
else
{
sheet.BringWindowToTop();
}
当要从内存中清除这些页面是可以重载属性单类的PostNcDestroy()虚函数:
PostNcDestroy()
{
int nPages = GetPageCount();
for (int i = (nPages - 1); i >= 0; i--)
{
CPropertyPage* pPage = GetPage(i);
ASSERT(pPage);
if (pPage)
{
delete pPage;
RemovePage(i);
TRACE("[CMyPropertySheet::OnDestroy] Removing page %ld/n", i);
}
}
CPropertySheet::PostNcDestroy();
}