DataMekanix Home Docking Windows Made Easy

home / articles / docking views (2)


Docking views (2)

by M.Shams Mukhtar (XperSoft).

Step 1

Add a function like this to your FormView Class:

/** Note: pParent and pContext is a must in CreateView for doc/view ok */
BOOL CMyFormView::CreateView(CWnd* pParent, CCreateContext* pContext)
    // dwStyle &= ~WS_BORDER;

    // Create with the right size (wrong position)
    CRect rect(0,0,300,300);

    /** Note:> Upon this Create(...) WM_CREATE message is sent
        so OnCreate(..) will be called
        pContext != NULL then this will be added or registered
        to the document i.e. pContext->m_pCurrentDoc->AddView(this);
        this attaches this view to the current document
        this function also sets the view's document pointer
        to this document.

    if (!Create(NULL, NULL, dwStyle,
        rect, pParent, AFX_IDW_PANE_FIRST, pContext))
        TRACE0("Warning: couldn't create treeview pane!. \n");
        return FALSE;

    return TRUE;

Step 2

Add these two protected member pointer to your control bar class:

class CMyBar : public CSizingControlBar
      CMyFormView* m_pFormView;
      CCreateContext* m_pContext;

      CMyBar(CCreateContext* pContext =NULL);

Step 3

Use this constructor for your control bar:

CMyBar::CMyBar(CCreateContext* pContext /* =NULL*/ )
    m_pContext = pContext;
    CRuntimeClass* pFactory = RUNTIME_CLASS(CMyFormView);
    m_pFormView = (CMyFormView *)(pFactory->CreateObject() );

Step 4

Add a ON_WM_CREATE handler into your control bar class:



Step 5

Add OnCreate(...) to your control bar class

// CMyBar message handlers

int CMyBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
    if (baseCMyBar::OnCreate(lpCreateStruct) == -1)
        return -1;

   if (m_pFormView )
        m_pFormView->CreateView(this, m_pContext);
   return 0;

Step 6

Finally in your frame window or your child frame window (if MDI) override the OnCreateClient(...) like this:

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext*
    // .....

    // Now create Control windows
        return -1;      // fail to create

    return CMDIChildWnd::OnCreateClient(lpcs, pContext);

BOOL CChildFrame::CreateControlBars(CCreateContext* pContext)
    m_pwndDockBar = new CMyBar(pContext);

    if (!m_pwndDockBar->Create(_T("Resources"), this, CSize(80, 80),
        TRUE, 123))
        TRACE0("Failed to create mybar\n");
        return FALSE;      // fail to create

    return TRUE;

So that's it, it works and worked fine :)

Copyright 1998-2010 DataMekanix. All rights reserved.