|
|
Docking views (2)by M.Shams Mukhtar (XperSoft). Step 1Add 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) { DWORD dwStyle = AFX_WS_DEFAULT_VIEW; // 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 2Add these two protected member pointer to your control bar class: class CMyBar : public CSizingControlBar { protected: CMyFormView* m_pFormView; CCreateContext* m_pContext; //... public: CMyBar(CCreateContext* pContext =NULL); //... }; Step 3Use 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 4Add a BEGIN_MESSAGE_MAP(CMyBar, CControlBar) //{{AFX_MSG_MAP(CMyBar) ON_WM_CREATE() //}}AFX_MSG_MAP END_MESSAGE_MAP() Step 5Add ////////////////////////////////////////////////////////////////////// // 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 6Finally in your frame window or your child frame window (if MDI) override the OnCreateClient(...) like this: BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // ..... // Now create Control windows if(!CreateControlBars(pContext)) 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-2019 DataMekanix. All rights reserved.
|