现在的位置: 首页 > 综合 > 正文

模态属性与非模态属性页

2012年05月30日 ⁄ 综合 ⁄ 共 1428字 ⁄ 字号 评论关闭
在资源编辑器设置了属性页之后,就可以通过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();
      }
 

抱歉!评论已关闭.