多文档应用程序中 如何定制视图的标题?

来源:互联网 发布:刷淘宝流量 编辑:程序博客网 时间:2024/05/17 04:04

      通常来说,都希望定制视图的标题----实际上是视图的框架窗口。例如:你可能希望在标准标题上增加一些文本以区别应用程序的各个视图,可能还希望移去MFC附加到文档名称中的框架号码。

 

      解决方案:基于一个鲜为人知的未归档的虚函数CFrameWnd::OnUpdateFrameTitle()。每个CFrameWnd派生类都可以重载改函数,这样就能够定制显示的框架标题。每当框架窗口显示它的标题时,MFC就调用该函数。

 

      因为OnUpdateFrameTitle()是一个未归档的可重载虚函数,所以必须在没有任何ClassWizard帮助下手工把该函数增加到视图的框架窗口类中。

 

      //1、在视图的框架窗口类定义中增加

      virtual void OnUpdateFrameTitle( BOOL bAddToTitle );

      //2、在视图的框架窗口类实现中增加

      void CChildFrame::OnUpdateFrameTitle( BOOL bAddToTitle )
      {
             // 1 - First call default function
             CMDIChildWnd::OnUpdateFrameTitle( bAddToTitle );

 

             // 2 - Now adapt the title to our taste

             // 2a - Get the "standard" frame title
             CString strInitialTitle;
             GetWindowText( strInitialTitle );

 

             // 2b - Build our custom frame title
             CString strMyTitle = "Drawing View <" + strInitialTitle + ">";
             SetWindowText( strMyTitle );
      }

      

      //========================另外一种实现方法

     

      //2、在视图的框架窗口类实现中增加

      void CChildFrame::OnUpdateFrameTitle( BOOL bAddToTitle )
      {
             // 1 - First call default function
              CMDIChildWnd::OnUpdateFrameTitle( bAddToTitle );

              // 2 - Now adapt the title to our taste

              // 2a - Get the document title
              CDocument* pDoc = GetActiveDocument();
              if( pDoc )
              {
                            CString strDocTitle = pDoc->GetTitle();

                            // 2b - Build our custom frame title
                            CString strMyTitle = "Form - " + strDocTitle;
                            SetWindowText( strMyTitle );
              }

      }

 

       第一种方法使用CWnd::GetWindowText()来检索标准的MFC框架标题,能得到整个标准的MFC框架标题,如果一个文档有多个视图打开,则该标题将可能包括框架的数目(例如:Drawing1.ek1:2).

       而第二种方法只检索文档的标题,(例如:Drawing1.ek1)

 

 

 

      微软建议使用下面的技术:

      BOOL CChildFrame::preCreateWindow(cs)

      {

             cs.style &= ~FWS_ADDTOTITLE;

             return CMDIChildWnd::preCreateWindow(cs)      

      }

      

       void CDrawView::OnInitialUpdate()

       {

              CView::::OnInitialUpdate();

              CString strDocTitle=GetDocument()->GetTitle();

              CString strFrameTitle="My Own <"+ strDocTitle +">";

              GetParentFrame()->SetWindowText(strFrameTitle);

       }

 

      这个方法差不多能工作,它的主要缺点是只能在创建过程中设置框架窗口的标题。因此,如果文档名称改变了-----例如,用户执行了“File->Save As”命令-----框架窗口还保持旧的标题,这是很奇怪的。

 

 

原创粉丝点击