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

在这个基础上要实现在左侧添加对话框类方法:

原文地址: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 m_wndOptions;
     CXTPOfficeBorder m_wndProperties;
     CXTPOfficeBorder m_wndTools;
     CXTPOfficeBorder 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();

         }

你可能感兴趣的:(Codejock: 如何添加一个docking pane到你的应用程序中)