科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道模态属性与非模态属性页

模态属性与非模态属性页

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

尽管CPropertySheet对象的构造和显示方式都与CDialog对象相同,但CPropertySheet并不是从CDialog派生的

作者:ghost 来源:CSDN 2007年9月28日

关键字: ghost 模态属性 非模态属性

  • 评论
  • 分享微博
  • 分享邮件
在资源编辑器设置了属性页之后,就可以通过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();
      }

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1583751

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章