Toll Free: (877) 723-1442 U.S. and Canada
Support
ActiveX / COM
Visual C++ / MFC
Customer Spotlight
Corporate Partners
Contact Sales

Call center available M-F 9:00 - 6:00 US Eastern Time.

U.S. and Canada
(877) 723-1442

International
(517) 625-5729

Email

Adding a docking pane to your application

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.
  3. 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 <XTToolkitPro.h> // Xtreme Toolkit Pro components

    Xtreme DockingPane users:

     #include <XTDockingPanePro.h> // Xtreme DockingPane components



  2. Add CXTPDockingPaneManager member to CMainFrame class.


  3.  // Attributes

     public:

         CXTPDockingPaneManager m_paneManager;



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


  5. IDR_PANE_OPTIONS
    61446
    Options

    PROPERTIES
    61447
    Properties


  6. Add following to CMainFrame::OnCreate.


  7.      // 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);

         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.


  2.  // Attributes

     public:

     

         CStatic m_wndOptions;

         CEdit m_wndProperties;

         </pre>

     

             <li>Add OnDockingPaneNotify handler.</li>

             <pre 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 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.


  3.      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.


  2.      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;

         }



  3. 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.


  4.      void CMainFrame::OnClose()

         {

             // Save the current state for docking panes.

             CXTPDockingPaneLayout layoutNormal(&m_paneManager);

             m_paneManager.GetLayout(&layoutNormal);

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

             CMDIFrameWnd::OnClose();

         }



Microsoft, Visual Studio, and the Visual Studio logo are trademarks or registered trademarks of Microsoft Corporation in the United States and/or other countries. Other products and/or company names may be trademarks or registered trademarks of their respective owners.