Codejock: 如何添加一个docking pane到你的应用程序中

来源:互联网 发布:java filereader类 编辑:程序博客网 时间:2024/06/15 18:32
在这个基础上要实现在左侧添加对话框类方法:

原文地址:http://purpletulipdyc.blog.sohu.com/110458716.html

 

Author: Kirk Stowell
Posted: November 16, 2004
Environment: Visual C++ MFC

The following is a tutorial on how to create an MDI application with Docking Pane using the Visual Studio 6.0 Application Wizard. The same technique can be used for later versions of Visual Studio . NET as well.

Create a simple MDI application using the MFC AppWizard:

  1. From Visual Studio select ‘File’ then ‘New’ and select the ‘Projects’ tab.
  2. Choose MFC Appwizard(exe) as your project type and enter ‘MDISample’ as the project name.

  • For the first step, make sure that "Multiple documents" is selected then press the ‘Finish’ button.

    Add Empty Docking Pane

    1. Add the following line to your StdAfx.h file:

      Xtreme Toolkit Pro users:

       #include // Xtreme Toolkit Pro components

      Xtreme DockingPane users:

       #include // Xtreme DockingPane components



    2. Add CXTPDockingPaneManager member to CMainFrame class.

       // Attributes

       public:

           CXTPDockingPaneManager m_paneManager;



    3. Add string resources for the titles of the future panes

      IDR_PANE_OPTIONS
      61446
      Options

      PROPERTIES
      61447
      Properties


      在ResourseView中添加一个Dialog类。去掉边框等属性。命名为IDD_DIALOG_RESOURCE
    4. Add following to CMainFrame::OnCreate.

           // Initialize the docking pane manager and set the

           // initial them for the docking panes.  Do

           // this only after all control bars objects have been

           // created and docked.

           m_paneManager.InstallDockingPanes(this);

           m_paneManager.SetTheme(xtpPaneThemeOffice);

       

           // Create docking panes.

           CXTPDockingPane* pwndPane1 = m_paneManager.CreatePane(

               //IDR_PANE_OPTIONS, CRect(0, 0,200, 120), dockLeftOf);改为 IDD_DIALOG_RESOURCE          int nIDIcons[] = {IDD_DIALOG_RESOURCE, IDR_PANE_PROPERTIES};//同样的修改

           CXTPDockingPane* pwndPane2 = m_paneManager.CreatePane(

               IDR_PANE_PROPERTIES, CRect(0, 0,200, 120),

                   dockBottomOf, pwndPane1);

    Attach CWnd derived class to the panes:

    1. Add Cwnd derived class as member of CMainFrame.

       // Attributes

       public:                                                                                              CStatic m_wndOptions;

           CEdit m_wndProperties;

       //添加以下的成员变量

          CXTPOfficeBorder<CStatic> m_wndOptions;
       CXTPOfficeBorder<CEdit> m_wndProperties;
       CXTPOfficeBorder<CEdit> m_wndTools;
       CXTPOfficeBorder<CDialog> m_wndDialog;

       

              

    2. Add OnDockingPaneNotify handler.

              

      class="code">

               BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)

                   //{{AFX_MSG_MAP(CMainFrame)

                   ON_WM_CREATE()

                   //}}AFX_MSG_MAP

                   ON_MESSAGE(XTPWM_DOCKINGPANE_NOTIFY,

                       OnDockingPaneNotify)

               END_MESSAGE_MAP()

       

               LRESULT CMainFrame::OnDockingPaneNotify(WPARAM

                   wParam, LPARAM lParam)

           {

               if (wParam == XTP_DPN_SHOWWINDOW)

               {

                   CXTPDockingPane* pPane =

                           (CXTPDockingPane*)lParam;

       

               if (!pPane->IsValid())

               {

                   switch (pPane->GetID())

                   {

                   case IDR_PANE_PROPERTIES:

                       {                          

                         /*  if (

                           m_wndProperties.GetSafeHwnd() == 0)

                           {

                               m_wndProperties.Create(WS_CHILD|

                                   ES_AUTOVSCROLL|ES_MULTILINE,

                                   CRect(0, 0, 0, 0), this, 0);

                           }

                           pPane->Attach(&m_wndProperties);

                           break;

                       }*///改成如下:

      case IDD_DIALOG_RESOURCE:
          {
           if(m_wndDialog.GetSafeHwnd()==0)
           {
            m_wndDialog.Create(IDD_DIALOG_RESOURCE,this);//这一句话尤其重要
           }
           pPane->Attach(&m_wndDialog);
           break;
          }

                   case IDR_PANE_OPTIONS:

                       {                          

                           if (m_wndOptions.GetSafeHwnd() == 0)

                           {

                               m_wndOptions.Create(_T("\n\nOptions"),

                                   WS_CHILD|WS_CLIPCHILDREN|

                                   WS_CLIPSIBLINGS|SS_CENTER,

                                   CRect(0, 0, 0, 0), this, 0);

                           }

                           pPane->Attach(&m_wndOptions);

                           break;

                       }

                   }

                   }

                   return TRUE;

               }

               return FALSE;

           }

    Add image to pane.

    1. Create Bitmap with icons for created panes

    2. Add to CMainFrame::OnCreate.

           nt nIDIcons[] = {IDR_PANE_OPTIONS, IDR_PANE_PROPERTIES};

           m_paneManager.SetIcons(IDB_BITMAP_ICONS, nIDIcons,

               _countof(nIDIcons), RGB(0, 255, 0));

    Add Save/Load State

    1. Add following to the OnCreate function for CMainFrame. This will restore the previous state of docking panes.

           int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

           {

               ...

       

                   // Load the previous state for docking panes.

                   CXTPDockingPaneLayout layoutNormal(&m_paneManager);

               if (layoutNormal.Load(_T("NormalLayout")))

               {

                   m_paneManager.SetLayout(&layoutNormal);

               }

               return 0;

           }



    2. Add the OnClose message handler to CMainFrame and the following before the call to the base class. This will save the current state of your docking pane.

           void CMainFrame::OnClose()

           {

               // Save the current state for docking panes.

               CXTPDockingPaneLayout layoutNormal(&m_paneManager);

               m_paneManager.GetLayout(&layoutNormal);

               layoutNormal.Save(_T("NormalLayout"));

               CMDIFrameWnd::OnClose();

           }