Click here to Skip to main content
15,891,529 members
Articles / Desktop Programming / MFC

Understanding CDockablePane

Rate me:
Please Sign up or sign in to vote.
4.95/5 (80 votes)
19 Aug 2015Apache12 min read 362.1K   11.8K   134  
A good reference for CDockablePane
#include "stdafx.h"
#include "XDockPane.h"
#include "HtmlPane.h"
#include "ListPane.h"
#include "PdfPane.h"
#include "TreePane.h"
#include "ModalPane.h"
#include "SplitePane.h"
#include "DialogPane.h"
#include "FileView.h"
#include "ClassView.h"
#include "OutputWnd.h"
#include "FrameDlg.h"
#include "PhoneBook.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define IDC_HTML_PANE 100
#define IDC_TREE_PANE 101
#define IDC_LIST_PANE 102
#define IDC_PDF_PANE  103
#define IDC_MODAL_PANE 104
#define IDC_DIALOG_PANE 105
#define IDC_SPLITE_PANE 106
#define ID_OUTPUT_PANE 107
#define ID_CLASSVIEW_PANE 108
#define ID_FILEVIEW_PANE 109
#define ID_FRAME_DIALOG 110
#define ID_STATUSBAR_LINK 201
#define ID_PHONEBOOK 202

//used for dockablepane to reset it's pointer after close->destroy
const UINT WM_RESETMEMBER = ::RegisterWindowMessage(_T("WM_RESETMEMBER"));

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_COMMAND(ID_STATUSBAR_LINK,OnStatusLink)
	ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnApplicationLook)
	ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_OFF_2007_AQUA, &CMainFrame::OnUpdateApplicationLook)
	ON_REGISTERED_MESSAGE(AFX_WM_ON_PRESS_CLOSE_BUTTON,OnClosePane)
	ON_UPDATE_COMMAND_UI_RANGE(ID_INDICATOR_CAPS,ID_INDICATOR_SCRL,OnUpdateStatus)
	ON_UPDATE_COMMAND_UI(ID_STATUSBAR_LINK,OnEnableTrue)
	ON_REGISTERED_MESSAGE(WM_RESETMEMBER,OnResetMember)
	ON_COMMAND(ID_TREE_PANE,OnTreePane)
	ON_COMMAND(ID_LIST_PANE,OnListPane)
	ON_COMMAND(ID_PDF_PANE,OnPdfPane)
	ON_COMMAND(ID_HTML_PANE,OnHtmlPane)
	ON_COMMAND(ID_SPLITE_PANE,OnSplitePane)
	ON_COMMAND(ID_MODAL_PANE,OnModalPane)
	ON_COMMAND(ID_DIALOG_PANE,OnDialogPane)
	ON_COMMAND_RANGE(IDC_FILEVIEW_PANE,IDC_OUTPUT_PANE,OnVisualStudioPane)
	ON_COMMAND(ID_FRAME_DIALOG,OnFrameDlg)
	ON_COMMAND(ID_PHONEBOOK,OnPhoneBook)
END_MESSAGE_MAP()

CMainFrame::CMainFrame()
{
	//  disables loading of docking layout from the registry.
	//	GetDockingManager()->DisableRestoreDockState(TRUE);
	theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);
	m_htmlPane = NULL; 
	m_listPane = NULL; 
	m_pdfPane = NULL; 
	m_treePane = NULL; 
	m_modalPane = NULL ;
	m_splitePane = NULL ;
	m_dlgPane = NULL ;
	m_outputPane = NULL ;
	m_classPane = NULL ;
	m_filePane = NULL ;
}

CMainFrame::~CMainFrame()
{
	SAFE_DELETE(m_htmlPane);
	SAFE_DELETE(m_listPane);
	SAFE_DELETE(m_pdfPane);
	SAFE_DELETE(m_treePane); 
	SAFE_DELETE(m_modalPane);
	SAFE_DELETE(m_splitePane);
	SAFE_DELETE(m_dlgPane);
	SAFE_DELETE(m_outputPane);
	SAFE_DELETE(m_classPane);
	SAFE_DELETE(m_filePane);
}

void CMainFrame::OnDestroy()
{
	m_regCmdMsg.RemoveAll();
	CFrameWndEx::OnDestroy();
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
		return -1;

	OnApplicationLook(theApp.m_nAppLook);
	m_wndRibbonBar.Create(this);
	InitializeRibbon();

	if (!CreateStatusBar())
	{
		TRACE0("Failed to create status bar\n");
		return -1;
	}

	// enable Visual Studio 2005 style docking window behavior
	CDockingManager::SetDockingMode(DT_SMART);
	// enable Visual Studio 2005 style docking window auto-hide behavior
	EnableAutoHidePanes(CBRS_ALIGN_ANY);

	CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0);
	m_wndRichView = GetActiveView();
	RecalcLayout();
	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWndEx::PreCreateWindow(cs) )
		return FALSE;
	cs.lpszName = _T("XDockPane");
	SetTitle(_T("XDockPane"));
	return TRUE;
}

void CMainFrame::InitializeRibbon()
{
	BOOL bNameValid;
	CString strTemp;
	bNameValid = strTemp.LoadString(IDS_RIBBON_FILE);
	ASSERT(bNameValid);
	m_PanelImages.SetImageSize(CSize(16, 16));
	m_PanelImages.Load(IDB_BUTTONS);

	// Init main button:
	m_MainButton.SetImage(IDB_MAIN);
	m_MainButton.SetText(_T("\nf"));
	m_MainButton.SetToolTipText(strTemp);

	m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));
	CMFCRibbonMainPanel* pMainPanel = m_wndRibbonBar.AddMainCategory(strTemp, IDB_FILESMALL, IDB_FILELARGE);

	bNameValid = strTemp.LoadString(IDS_RIBBON_NEW);
	ASSERT(bNameValid);
	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_NEW, strTemp, 0, 0));
	bNameValid = strTemp.LoadString(IDS_RIBBON_OPEN);
	ASSERT(bNameValid);
	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_OPEN, strTemp, 1, 1));
	bNameValid = strTemp.LoadString(IDS_RIBBON_SAVE);
	ASSERT(bNameValid);
	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE, strTemp, 2, 2));
	bNameValid = strTemp.LoadString(IDS_RIBBON_SAVEAS);
	ASSERT(bNameValid);
	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_SAVE_AS, strTemp, 3, 3));

	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT);
	ASSERT(bNameValid);
	CMFCRibbonButton* pBtnPrint = new CMFCRibbonButton(ID_FILE_PRINT, strTemp, 6, 6);
	pBtnPrint->SetKeys(_T("p"), _T("w"));
	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_LABEL);
	ASSERT(bNameValid);
	pBtnPrint->AddSubItem(new CMFCRibbonLabel(strTemp));
	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_QUICK);
	ASSERT(bNameValid);
	pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_DIRECT, strTemp, 7, 7, TRUE));
	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_PREVIEW);
	ASSERT(bNameValid);
	pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_PREVIEW, strTemp, 8, 8, TRUE));
	bNameValid = strTemp.LoadString(IDS_RIBBON_PRINT_SETUP);
	ASSERT(bNameValid);
	pBtnPrint->AddSubItem(new CMFCRibbonButton(ID_FILE_PRINT_SETUP, strTemp, 11, 11, TRUE));
	pMainPanel->Add(pBtnPrint);
	pMainPanel->Add(new CMFCRibbonSeparator(TRUE));

	bNameValid = strTemp.LoadString(IDS_RIBBON_CLOSE);
	ASSERT(bNameValid);
	pMainPanel->Add(new CMFCRibbonButton(ID_FILE_CLOSE, strTemp, 9, 9));

	bNameValid = strTemp.LoadString(IDS_RIBBON_RECENT_DOCS);
	ASSERT(bNameValid);
	pMainPanel->AddRecentFilesList(strTemp);

	bNameValid = strTemp.LoadString(IDS_RIBBON_EXIT);
	ASSERT(bNameValid);
	pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_APP_EXIT, strTemp, 15));

	bNameValid = strTemp.LoadString(IDS_RIBBON_HOME);
	ASSERT(bNameValid);
	CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE);

	// add visual studio precreated pane
	CMFCRibbonPanel* pVSPanel = pCategoryHome->AddPanel(_T("VS Precreated Pane"));
	pVSPanel->SetKeys(_T("VP"));
	CMFCRibbonButton* pBtnFileViewPane = new CMFCRibbonButton(IDC_FILEVIEW_PANE,_T("File View"), -1, 2);
	CMFCRibbonButton* pBtnClassViewPane = new CMFCRibbonButton(IDC_CLASSVIEW_PANE,_T("CLASS View"), -1, 3);
	CMFCRibbonButton* pBtnOutputPane = new CMFCRibbonButton(IDC_OUTPUT_PANE,_T("Output View"), -1, 4);
	pVSPanel->Add(pBtnFileViewPane);
	pVSPanel->Add(pBtnClassViewPane);
	pVSPanel->Add(pBtnOutputPane);

	// add basic pane panel
	CMFCRibbonPanel* pBasicPanel = pCategoryHome->AddPanel(_T("Basic Pane"));
	pBasicPanel->SetKeys(_T("BP"));
	CMFCRibbonButton* pBtnTreePane = new CMFCRibbonButton(ID_TREE_PANE,_T("Tree Pane"), -1, 5);
	CMFCRibbonButton* pBtnListPane = new CMFCRibbonButton(ID_LIST_PANE,_T("LIST Pane"), -1, 6);
	pBasicPanel->Add(pBtnTreePane);
	pBasicPanel->Add(pBtnListPane);
	
	//add Advanced pane panel
	CMFCRibbonPanel* pAdvanedPanel = pCategoryHome->AddPanel(_T("Advanced Pane"));
	pAdvanedPanel->SetKeys(_T("AP"));
	CMFCRibbonButton* pBtnPdfPane = new CMFCRibbonButton(ID_PDF_PANE,_T("PDF Pane"),-1,7);
	CMFCRibbonButton* pBtnHtmlPane = new CMFCRibbonButton(ID_HTML_PANE,_T("HTML Pane"),-1,8);
	CMFCRibbonButton* pBtnModalPane = new CMFCRibbonButton(ID_MODAL_PANE,_T("Modal Loop Pane"),-1,9);
	CMFCRibbonButton* pBtnDialogPane = new CMFCRibbonButton(ID_DIALOG_PANE,_T("Dialog Pane"),-1,10);
	CMFCRibbonButton* pBtnSplitePane = new CMFCRibbonButton(ID_SPLITE_PANE,_T("Splite Pane"),-1,11);
	pAdvanedPanel->Add(pBtnPdfPane);
	pAdvanedPanel->Add(pBtnHtmlPane);
	pAdvanedPanel->Add(pBtnSplitePane);
	pAdvanedPanel->Add(pBtnModalPane);
	pAdvanedPanel->Add(pBtnDialogPane);

	//add Miscellaneous pane
	CMFCRibbonPanel* pMiscellaneousPanel = pCategoryHome->AddPanel(_T("Miscellaneous"));
	pMiscellaneousPanel->SetKeys(_T("MP"));
	CMFCRibbonButton* pBtnFrameDlg = new CMFCRibbonButton(ID_FRAME_DIALOG,_T("Frame Dialog"),-1,10);
	CMFCRibbonButton* pBtnPhoneDlg = new CMFCRibbonButton(ID_PHONEBOOK,_T("Phone Book"),-1,12);
	pMiscellaneousPanel->Add(pBtnFrameDlg);
	pMiscellaneousPanel->Add(pBtnPhoneDlg);


	// Add elements to the right side of tabs:
	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE);
	ASSERT(bNameValid);
	CMFCRibbonButton* pVisualStyleButton = new CMFCRibbonButton(-1, strTemp, -1, -1);
	pVisualStyleButton->SetMenu(IDR_THEME_MENU, FALSE /* No default command */, TRUE /* Right align */);
	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_TIP);
	ASSERT(bNameValid);
	pVisualStyleButton->SetToolTipText(strTemp);
	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_DESC);
	ASSERT(bNameValid);
	pVisualStyleButton->SetDescription(strTemp);
	m_wndRibbonBar.AddToTabs(pVisualStyleButton);

	// Add quick access toolbar commands:
	CList<UINT, UINT> lstQATCmds;
	lstQATCmds.AddTail(ID_FILE_NEW);
	lstQATCmds.AddTail(ID_FILE_OPEN);
	lstQATCmds.AddTail(ID_FILE_SAVE);
	lstQATCmds.AddTail(ID_FILE_PRINT_DIRECT);
	m_wndRibbonBar.SetQuickAccessCommands(lstQATCmds);

	m_wndRibbonBar.AddToTabs(new CMFCRibbonButton(ID_APP_ABOUT, _T("\na"), m_PanelImages.ExtractIcon (0)));
}

BOOL CMainFrame::CreateStatusBar()
{
	if (!m_wndStatusBar.Create(this))
	{
		TRACE0("Failed to create status bar\n");
		return FALSE;
	}
	m_wndStatusBar.EnableToolTips(TRUE,FALSE);
	m_wndStatusBar.AddElement(new CMFCRibbonLinkCtrl(ID_STATUSBAR_LINK, _T("Developed By Huzifa"), _T("http://www.CodeProject.com/members/huzifa30")), _T("Link to website"));
	m_wndStatusBar.AddSeparator();

	m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_INDICATOR_CAPS,_T("CAP"),0),_T("CAP"));
	m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_INDICATOR_NUM,_T("NUM"),0),_T("NUM"));
	m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_INDICATOR_SCRL,_T("SCRL"),0),_T("SCRL"));
	m_wndStatusBar.AddSeparator();

	return TRUE;
}

void CMainFrame::OnUpdateStatus(CCmdUI*ui)
{
	UINT flag = 0x0001;
	switch(ui->m_nID)
	{
		case ID_STATUSBAR_LINK:
			ui->Enable();
			break;
		case ID_INDICATOR_CAPS:
			ui->Enable(::GetKeyState(VK_CAPITAL) & flag ); 
			break;
		case ID_INDICATOR_SCRL:
			ui->Enable(::GetKeyState(VK_SCROLL) & flag ); 
			break;
		case ID_INDICATOR_NUM:
			ui->Enable(::GetKeyState(VK_NUMLOCK) & flag ); 
			break;
	}
}

void CMainFrame::OnApplicationLook(UINT id)
{
	CWaitCursor wait;
	theApp.m_nAppLook = id;
	switch (theApp.m_nAppLook)
	{
		case ID_VIEW_APPLOOK_OFF_2007_BLUE:
			CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
			break;

		case ID_VIEW_APPLOOK_OFF_2007_BLACK:
			CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
			break;

		case ID_VIEW_APPLOOK_OFF_2007_SILVER:
			CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);
			break;

		case ID_VIEW_APPLOOK_OFF_2007_AQUA:
			CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);
			break;
	}

	CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
	CDockingManager::SetDockingMode(DT_SMART);
	RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
	theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
}

void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)
{
	pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
}

void CMainFrame::OnHtmlPane()
{
	if(m_htmlPane && m_htmlPane->GetSafeHwnd())
	{
		m_htmlPane->ShowPane(TRUE,FALSE,TRUE);
		return ;
	}
	m_htmlPane = new CHtmlPane;
	UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
	CString strTitle = _T("Html Pane");
	if (!m_htmlPane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
		IDC_HTML_PANE, style))
	{
		TRACE0("Failed to create html pane\n");
		SAFE_DELETE(m_htmlPane);
		return ; 
	}
	m_htmlPane->EnableDocking(CBRS_ALIGN_ANY);
	CDockablePane* pTabbedBar = NULL;
	DockPane((CBasePane*)m_htmlPane,AFX_IDW_DOCKBAR_RIGHT);
	if(m_treePane)
		DockPaneLeftOf(m_htmlPane,m_treePane);
	m_htmlPane->ShowPane(TRUE,FALSE,TRUE);
	RecalcLayout();
	
}
void CMainFrame::OnPdfPane()
{
	if(m_pdfPane && m_pdfPane->GetSafeHwnd())
	{
		m_pdfPane->ShowPane(TRUE,FALSE,TRUE);
		return ;
	}
	m_pdfPane = new CPdfPane;
	UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
	CString strTitle = _T("Pdf Pane");
	if (!m_pdfPane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
		IDC_PDF_PANE, style))
	{
		TRACE0("Failed to create Pdf pane\n");
		SAFE_DELETE(m_pdfPane);
		return ; 
	}
	m_pdfPane->EnableDocking(CBRS_ALIGN_ANY);
	DockPane((CBasePane*)m_pdfPane,AFX_IDW_DOCKBAR_RIGHT);
	m_pdfPane->ShowPane(TRUE,FALSE,TRUE);
	RecalcLayout();
	RegCmdMsg(m_pdfPane);
	AfxMessageBox(_T("Click Open from Frame window to Open a PDF File"));
}
void CMainFrame::OnListPane()
{
	if(m_listPane && m_listPane->GetSafeHwnd())
	{
		m_listPane->ShowPane(TRUE,FALSE,TRUE);
		return ;
	}
	m_listPane = new CListPane;
	UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
	CString strTitle = _T("List Pane");
	if (!m_listPane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
		IDC_LIST_PANE, style))
	{
		TRACE0("Failed to create List pane\n");
		SAFE_DELETE(m_listPane);
		return ; 
	}
	m_listPane->EnableDocking(CBRS_ALIGN_ANY);
	DockPane((CBasePane*)m_listPane,AFX_IDW_DOCKBAR_LEFT);
	CDockablePane* pTabbedBar = NULL;
	// make list pane attach to treepane if it's already created
	if(m_treePane && m_treePane->GetSafeHwnd())
		m_listPane->AttachToTabWnd(m_treePane, DM_SHOW, TRUE, &pTabbedBar);
	
	m_listPane->ShowPane(TRUE,FALSE,TRUE);
	RecalcLayout();
}
void CMainFrame::OnTreePane()
{
	if(m_treePane && m_treePane->GetSafeHwnd())
	{
		m_treePane->ShowPane(TRUE,FALSE,TRUE);
		return ;
	}
	m_treePane = new CTreePane;
	UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
	CString strTitle = _T("Tree Pane");
	if (!m_treePane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
		IDC_TREE_PANE, style))
	{
		TRACE0("Failed to create Tree pane\n");
		SAFE_DELETE(m_treePane);
		return ; 
	}
	m_treePane->EnableDocking(CBRS_ALIGN_ANY);
	DockPane((CBasePane*)m_treePane,AFX_IDW_DOCKBAR_LEFT);

	// make treepane attach to list pane if it's already created
	CDockablePane* pTabbedBar = NULL;
	if(m_listPane && m_listPane->GetSafeHwnd())
		m_treePane->AttachToTabWnd(m_listPane, DM_SHOW, TRUE, &pTabbedBar);
	else
		m_treePane->ShowPane(TRUE,FALSE,TRUE);
	m_treePane->SetMinSize(CSize(200,100));
	RecalcLayout();
}

void CMainFrame::OnModalPane()
{
	m_modalPane = new CModalPane;
	UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI ;
	UINT styleEx = WS_EX_TOPMOST|WS_EX_DLGMODALFRAME|WS_EX_WINDOWEDGE;
	CString strTitle = _T("Modal loop Pane");
	CRect rect(0, 0, 200, 400);
	if (!m_modalPane->CreateEx(styleEx,strTitle, this,rect, TRUE,
		IDC_MODAL_PANE, style))
	{
		TRACE0("Failed to create Modal loop pane\n");
		SAFE_DELETE(m_modalPane);
		return ; 
	}
	m_modalPane->EnableDocking(CBRS_NOALIGN);
	//make m_modalPane initialy floating  
	ClientToScreen(&rect);
	m_modalPane->FloatPane(rect);
	((CModalPane*)m_modalPane)->DoModal();
}

LRESULT CMainFrame::OnResetMember(WPARAM wp,LPARAM)
{
	int id = (int)wp;
	switch(id)
	{
		case IDC_TREE_PANE:
			SAFE_DELETE(m_treePane);
			break;
		case IDC_LIST_PANE :
			SAFE_DELETE(m_listPane);
			break;
		case IDC_PDF_PANE :
			SAFE_DELETE(m_pdfPane);
			break;
		case IDC_HTML_PANE :
			SAFE_DELETE(m_htmlPane);
			break;
		case IDC_MODAL_PANE:
			SAFE_DELETE(m_modalPane);
			break;
		case IDC_DIALOG_PANE :
			SAFE_DELETE(m_dlgPane);
			break;
		case IDC_SPLITE_PANE:
			SAFE_DELETE(m_splitePane);
			break;
		case ID_OUTPUT_PANE :
			SAFE_DELETE(m_outputPane);
			break;
		case ID_CLASSVIEW_PANE:
			SAFE_DELETE(m_classPane);
			break;
		case ID_FILEVIEW_PANE :
			SAFE_DELETE(m_filePane);
			break;
		default :
			return (LRESULT)FALSE;//id warent found
	}
	return (LRESULT)TRUE;
}
LRESULT CMainFrame::OnClosePane(WPARAM,LPARAM lp)
{
	CBasePane* pane = (CBasePane*)lp;
	if(pane && pane->GetSafeHwnd())
	{
		int id = pane->GetDlgCtrlID();
		pane->ShowPane(FALSE, FALSE, FALSE);//hide pane
		RemovePaneFromDockManager(pane,TRUE,TRUE,TRUE,NULL);//remove from manager
		UnregCmdMsg(pane);//unregister pane from command routing list
		pane->PostMessage(WM_CLOSE);//close and destroy
		PostMessage(WM_RESETMEMBER,id,0);//reset our member to null
		AdjustDockingLayout();//recalc docking layout
		return (LRESULT)TRUE;//prevent close , we already close it
	}
	return FALSE;
}

void CMainFrame::RegCmdMsg(CBasePane* pane)
{
	m_regCmdMsg.AddTail(pane);
}
void CMainFrame::UnregCmdMsg(CBasePane* pane)
{
	POSITION pos = m_regCmdMsg.GetHeadPosition();
	CBasePane* i ;
	while (pos)
	{
		i = m_regCmdMsg.GetAt(pos);
		if(i == pane )
		{
			m_regCmdMsg.RemoveAt(pos);
			return ;
		}
		m_regCmdMsg.GetNext(pos);
	}
}

BOOL CMainFrame::OnCmdMsg(UINT id,int code , void *pExtra,AFX_CMDHANDLERINFO* pHandler)
{
	//route cmd first to registered dockable pane 
	POSITION pos = m_regCmdMsg.GetHeadPosition();
	while (pos)
	{
		CBasePane* pane = m_regCmdMsg.GetAt(pos);
		if(pane && pane->GetSafeHwnd() && pane->IsVisible() 
			&& pane->OnCmdMsg(id,code,pExtra,pHandler))
				return TRUE;
		m_regCmdMsg.GetNext(pos);
	}
	return CFrameWndEx::OnCmdMsg(id,code,pExtra,pHandler);
}


void CMainFrame::OnDialogPane()
{
	if(m_dlgPane && m_dlgPane->GetSafeHwnd())
	{
		m_dlgPane->ShowPane(TRUE,FALSE,TRUE);
		return ;
	}
	m_dlgPane = new CDialogPane;
	UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI;
	CString strTitle = _T("Child Dialog Pane");
	if (!m_dlgPane->Create(strTitle, this, CRect(0, 0, 300, 400), TRUE,
		IDC_DIALOG_PANE, style,AFX_CBRS_OUTLOOK_TABS))
	{
		TRACE0("Failed to create dialog pane\n");
		SAFE_DELETE(m_dlgPane);
		return ; 
	}
	m_dlgPane->EnableDocking(CBRS_ALIGN_ANY);
	DockPane((CBasePane*)m_dlgPane,AFX_IDW_DOCKBAR_RIGHT);
	CDockablePane* pTabbedBar = NULL;
	if(m_splitePane && m_splitePane->GetSafeHwnd())
		m_dlgPane->AttachToTabWnd(m_splitePane, DM_SHOW, TRUE, &pTabbedBar);
	else
		m_dlgPane->ShowPane(TRUE,FALSE,TRUE);
	RecalcLayout();
}
void CMainFrame::OnSplitePane()
{
	if(m_splitePane && m_splitePane->GetSafeHwnd())
	{
		m_splitePane->ShowPane(TRUE,FALSE,TRUE);
		return ;
	}
	m_splitePane = new CSplitePane;
	UINT style = WS_CHILD | CBRS_RIGHT |CBRS_FLOAT_MULTI|AFX_CBRS_AUTO_ROLLUP;
	CString strTitle = _T("Splite Pane");
	if (!m_splitePane->Create(strTitle, this, CRect(0, 0, 200, 400), TRUE,
		IDC_SPLITE_PANE, style,AFX_CBRS_OUTLOOK_TABS))
	{
		TRACE0("Failed to create Splite pane\n");
		SAFE_DELETE(m_splitePane);
		return ; 
	}
	m_splitePane->EnableDocking(CBRS_ALIGN_ANY);
	DockPane((CBasePane*)m_splitePane,AFX_IDW_DOCKBAR_RIGHT);
	CDockablePane* pTabbedBar = NULL;
	if(m_dlgPane && m_dlgPane->GetSafeHwnd())
		m_splitePane->AttachToTabWnd(m_dlgPane, DM_SHOW, TRUE, &pTabbedBar);
	else
		m_splitePane->ShowPane(TRUE,FALSE,TRUE);
	m_splitePane->ToggleAutoHide();
	RecalcLayout();
}

void CMainFrame::OnVisualStudioPane(UINT cmd)
{
	CString name;
	DWORD style =  WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS 
		| WS_CLIPCHILDREN | CBRS_FLOAT_MULTI;
	HICON hIcon;
	switch(cmd)
	{
		case IDC_FILEVIEW_PANE: 
			{
				if(m_filePane && m_filePane->GetSafeHwnd())
				{
					m_filePane->ShowPane(TRUE,FALSE,TRUE);
					break ;
				}
				m_filePane = new CFileView;
				name.LoadString(IDS_FILE_VIEW);
				if (!m_filePane->Create(name, this, CRect(0, 0, 200, 200), TRUE, ID_FILEVIEW_PANE, style|CBRS_LEFT|CBRS_SIZE_FIXED))
				{
					TRACE0("Failed to create File View window\n");
					ASSERT(FALSE); // failed to create
				}
				m_filePane->EnableDocking(CBRS_ALIGN_ANY);
				HICON hIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_FILE_VIEW_HC), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
				m_filePane->SetIcon(hIcon, FALSE);
				if(m_classPane && m_classPane->GetSafeHwnd())
				{
					if(!m_filePane->DockToWindow(m_classPane,CBRS_ALIGN_BOTTOM))
						DockPane(m_filePane,AFX_IDW_DOCKBAR_LEFT);
				}
				else
					DockPane(m_filePane,AFX_IDW_DOCKBAR_LEFT);
				break;
			}
		case IDC_CLASSVIEW_PANE: 
			{
				if(m_classPane && m_classPane->GetSafeHwnd())
				{
					m_classPane->ShowPane(TRUE,FALSE,TRUE);
					break ;
				}
				m_classPane = new CClassView;
				name.LoadString(IDS_CLASS_VIEW);
				if (!m_classPane->Create(name, this, CRect(0, 0, 200, 200), TRUE, ID_CLASSVIEW_PANE,style|CBRS_LEFT))
				{
					TRACE0("Failed to create Class View window\n");
					ASSERT(FALSE); // failed to create
				}
				m_classPane->EnableDocking(CBRS_ALIGN_ANY);
				hIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_CLASS_VIEW_HC), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
				m_classPane->SetIcon(hIcon, FALSE);
				m_classPane->EnableAutohideAll();
				if(m_filePane && m_filePane->GetSafeHwnd())
				{
					if(!m_classPane->DockToWindow(m_filePane,CBRS_ALIGN_TOP))
						DockPane(m_classPane,AFX_IDW_DOCKBAR_LEFT);
				}
				else
					DockPane(m_classPane,AFX_IDW_DOCKBAR_LEFT);

				break;
			}
		case IDC_OUTPUT_PANE: 
			{
				if(m_outputPane && m_outputPane->GetSafeHwnd())
				{
					m_outputPane->ShowPane(TRUE,FALSE,TRUE);
					break;
				}
				m_outputPane = new COutputWnd;
				name.LoadString(IDS_OUTPUT_WND);
				if (!m_outputPane->Create(name, this, CRect(0, 0, 100, 100), TRUE,ID_OUTPUT_PANE ,style | CBRS_BOTTOM))
				{
					TRACE0("Failed to create Output window\n");
					ASSERT(FALSE); // failed to create
				}
				m_outputPane->EnableDocking(CBRS_ALIGN_ANY);
				hIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_OUTPUT_WND_HC), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
				m_outputPane->SetIcon(hIcon, FALSE);
				DockPane(m_outputPane,AFX_IDW_DOCKBAR_BOTTOM);
				m_outputPane->RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
				break;
			}
	}//switch
	RecalcLayout();
}
void CMainFrame::OnStatusLink()
{
	CMFCRibbonLinkCtrl* pLink = (CMFCRibbonLinkCtrl*) m_wndStatusBar.FindByID(ID_STATUSBAR_LINK);
	if (pLink)
		pLink->OpenLink();//open link in status bar 
}
void CMainFrame::OnFrameDlg()
{
	CFrameDlg dlg(this); 
	dlg.DoModal();
}

void CMainFrame::OnPhoneBook()
{
	PhoneBook dlg(this);
	dlg.DoModal();
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0


Written By
Software Developer (Senior)
Syrian Arab Republic Syrian Arab Republic
C++ , MFC , Win32 professional Developer.

Comments and Discussions