Click here to Skip to main content
15,893,190 members
Articles / Desktop Programming / MFC

The Ultimate Toolbox Home Page

Rate me:
Please Sign up or sign in to vote.
4.97/5 (141 votes)
25 Aug 2007CPOL13 min read 3.2M   91.4K   476  
The Ultimate Toolbox is now Open Source
// multipad.cpp : Defines the class behaviors for the Multipad application.
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1997 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.

#include "stdafx.h"
#include "multipad.h"
#include "CustomizeDlg.h"
#include <locale.h>

#include "UTSampleAbout.h"

CMultiPadApp NEAR theApp;
static HINSTANCE g_hRichEdDLL=NULL;

BEGIN_MESSAGE_MAP(CMultiPadApp, CWinApp)
	//{{AFX_MSG_MAP(CMultiPadApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)     // file commands...
	ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
	ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

BOOL CMultiPadApp::InitInstance()
{
	_tsetlocale(LC_ALL, _T(""));

	// Initialize RichEdit control
	// for About Dialog
	if(g_hRichEdDLL==NULL)
	{
		g_hRichEdDLL=::LoadLibrary(_T("RICHED32.DLL"));
		if(g_hRichEdDLL==NULL)
			TRACE(_T("Cannot load library to display RichEditTextControl"));
	}


	Enable3dControls();

	// use registry if you want to save CoolToolBars state
	SetRegistryKey(_T("Ultimate Toolbox Samples"));

	LoadStdProfileSettings();

#ifdef _MDI_INTERFACE
	AddDocTemplate(new CMultiDocTemplate(IDR_TEXTTYPE,
		RUNTIME_CLASS(CPadDoc), RUNTIME_CLASS(CMDIChildWnd),
		RUNTIME_CLASS(CEditView)));
	m_pMainWnd = new CMainFrame;
	((CFrameWnd*)m_pMainWnd)->LoadFrame(IDR_MAINFRAME);
	m_pMainWnd->ShowWindow(m_nCmdShow);
#else
	AddDocTemplate(new CSingleDocTemplate(IDR_MAINFRAME,
		RUNTIME_CLASS(CPadDoc),
		RUNTIME_CLASS(CMainFrame),       // main SDI frame window
		RUNTIME_CLASS(CEditView)));
#endif

	// Parse command line for standard shell commands, DDE, file open
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);

	// Dispatch commands specified on the command line
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;

	// enable file manager drag/drop and DDE Execute open
	m_pMainWnd->DragAcceptFiles();
	EnableShellOpen();
	RegisterShellFileTypes(TRUE);

	// load saved workspace after all bars were created
	((CMainFrame*)m_pMainWnd)->LoadWorkspace();

	return TRUE;
}

void CMultiPadApp::OnAppAbout()
{
	CUTSampleAboutDlg dlgAbout(IDR_MAINFRAME,ID_DESCRIPTION_FILE);
	dlgAbout.DoModal();
}

int CMultiPadApp::ExitInstance() 
{
	// TODO: Add your specialized code here and/or call the base class
	
	// unload the library
	if(g_hRichEdDLL!=NULL)
		::FreeLibrary(g_hRichEdDLL);

	return CWinApp::ExitInstance();
}

IMPLEMENT_DYNCREATE(CMainFrame, CMainFrameWindow)

BEGIN_MESSAGE_MAP(CMainFrame, CMainFrameWindow)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_CLOSE()
	ON_COMMAND(ID_VIEW_CUSTOMIZE, OnViewCustomize)
	ON_COMMAND(IDW_COOLBAR, OnCoolbar)
	ON_UPDATE_COMMAND_UI(IDW_COOLBAR, OnUpdateCoolbar)
	//}}AFX_MSG_MAP
#if _MFC_VER>=0x0420
	ON_NOTIFY(NM_CUSTOMDRAW,IDW_COOLBAR,OnCustomDraw)
#endif
END_MESSAGE_MAP()


// we need these arrays to make our CoolToolBars customizable
// we use them as parameters in function COXCoolToolBar::SetBitmapIds()

static UINT buttonsFile[] =
{
	ID_FILE_NEW, 
	ID_FILE_OPEN, 
	ID_FILE_CLOSE, 
	ID_FILE_SAVE, 
	ID_FILE_SAVE_AS, 
	ID_FILE_PRINT, 
	ID_APP_ABOUT,
};

static UINT buttonsEdit[] =
{
	ID_EDIT_CUT, 
	ID_EDIT_COPY, 
	ID_EDIT_PASTE, 
	ID_EDIT_CLEAR, 
	ID_EDIT_FIND, 
	ID_EDIT_REPEAT, 
};

static UINT buttonsWindow[] =
{
	ID_WINDOW_CASCADE,
	ID_WINDOW_TILE_HORZ,
	ID_WINDOW_ARRANGE,
};

static UINT indicators[] =
{
	ID_SEPARATOR, 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL
};

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if(CMainFrameWindow::OnCreate(lpCreateStruct)==-1)
	{
		return -1;
	}

	// create standard statusbar 
	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE(_T("Failed to create status bar\n"));
		return -1;      // fail to create
	}

	// Create cool bar
	// refer to the documentation about styles used to create Coolbar
	if (!m_wndCoolBar.Create(this,
		WS_CHILD|WS_VISIBLE|WS_BORDER|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|
		RBS_TOOLTIPS|RBS_BANDBORDERS|RBS_VARHEIGHT)) 
	{
		TRACE(_T("Failed to create cool bar\n"));
		return -1;      // fail to create
	}

	// create toolbars

	//////////////////////////////
	// File ToolBar
	// this is an example of simple toolbar without text
	// but we add here images to show in hot mode
	// Note that process of creation of CoolToolBar almost the same as
	// standard CToolBar
	if (!m_wndToolBarFile.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP,
		ID_VIEW_TOOLBAR_FILE) ||
		!m_wndToolBarFile.LoadToolBar(IDR_TOOLBAR_FILE))
		{
		TRACE(_T("Failed to create File toolbar\n"));
		return -1;      // fail to create
		} 
	// 	This function specifies the command ID's of the button images in the bitmap.
	m_wndToolBarFile.SetBitmapIds(buttonsFile, sizeof(buttonsFile)/sizeof(UINT));

	/////////////
	// COXCoolToolBar specific functions
	m_wndToolBarFile.IniSizes(CSize(16,16));
	// we want to use this CoolToolBar in CoolBar 
	// so we have to set it in cool mode
	m_wndToolBarFile.SetCool();
	m_wndToolBarFile.SetHotImageList(m_wndToolBarFile.
		AddImageList(IDR_TOOLBAR_FILE_HOT));
	m_wndToolBarFile.SetDefaultTextColor(RGB(0,0,128));
	m_wndToolBarFile.SetHotTextColor(RGB(0,0,255));
	m_wndToolBarFile.UpdateSizes();
	////////////

	// TODO: Remove this if you don't want tool tips or a resizeable toolbar
	m_wndToolBarFile.SetBarStyle(m_wndToolBarFile.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
	//////////////////////////////

	//////////////////////////////
	// Edit ToolBar
	if (!m_wndToolBarEdit.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP,
		ID_VIEW_TOOLBAR_EDIT) ||
		!m_wndToolBarEdit.LoadToolBar(IDR_TOOLBAR_EDIT))
		{
		TRACE(_T("Failed to create Edit toolbar\n"));
		return -1;      // fail to create
		} 
	// 	This function specifies the command ID's of the button images in the bitmap.
	m_wndToolBarEdit.SetBitmapIds(buttonsEdit, sizeof(buttonsEdit)/sizeof(UINT));

	/////////////
	// COXCoolToolBar specific functions
	m_wndToolBarEdit.IniSizes(CSize(16,16));
	// we want to use this CoolToolBar in CoolBar 
	// so we have to set it in cool mode
	m_wndToolBarEdit.SetCool();
	m_wndToolBarEdit.SetHotImageList(m_wndToolBarEdit.
		AddImageList(IDR_TOOLBAR_EDIT_HOT));
	m_wndToolBarEdit.SetDefaultTextColor(RGB(0,0,128));
	m_wndToolBarEdit.SetHotTextColor(RGB(0,0,255));
	// we want to use text from string resource in our CoolToolBar
	m_wndToolBarEdit.SetButtonsMinMaxWidth(0,70);
	m_wndToolBarEdit.SetMaxTextRows(4);
	m_wndToolBarEdit.SetButtonTextFromID(COXCoolToolBar::TTID_PLAIN);
	m_wndToolBarEdit.UpdateSizes();
	////////////

	// TODO: Remove this if you don't want tool tips or a resizeable toolbar
	m_wndToolBarEdit.SetBarStyle(m_wndToolBarEdit.GetBarStyle() |
		CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
	//////////////////////////////

	//////////////////////////////
	// Window ToolBar
	if (!m_wndToolBarWindow.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP,
		ID_VIEW_TOOLBAR_WINDOW) ||
		!m_wndToolBarWindow.LoadToolBar(IDR_TOOLBAR_WINDOW))
		{
		TRACE(_T("Failed to create Window toolbar\n"));
		return -1;      // fail to create
		} 
	// 	This function specifies the command ID's of the button images in the bitmap.
	m_wndToolBarWindow.SetBitmapIds(buttonsWindow, sizeof(buttonsWindow)/sizeof(UINT));

	/////////////
	// COXCoolToolBar specific functions
	// use CoolToolBar in List mode
	m_wndToolBarWindow.IniSizes(CSize(16,16));
	// we want to use this CoolToolBar in CoolBar 
	// so we have to set it in cool mode
	m_wndToolBarWindow.SetCool();
	m_wndToolBarWindow.SetList();
	m_wndToolBarWindow.SetHotImageList(m_wndToolBarWindow.
		AddImageList(IDR_TOOLBAR_WINDOW_HOT));
	m_wndToolBarWindow.SetDefaultTextColor(RGB(0,0,128));
	m_wndToolBarWindow.SetHotTextColor(RGB(0,0,255));
	// we want to use tooltips text in our CoolToolBar
	m_wndToolBarWindow.SetMaxTextRows(1);
	m_wndToolBarWindow.SetButtonTextFromID(COXCoolToolBar::TTID_TOOLTIP);
	m_wndToolBarWindow.UpdateSizes();
	////////////

	// TODO: Remove this if you don't want tool tips or a resizeable toolbar
	m_wndToolBarWindow.SetBarStyle(m_wndToolBarWindow.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
	//////////////////////////////


	// create object of COXCoolBarInfo class to attach image list to the Coolbar
	COXCoolBarInfo rbi;
	// if you call COXCoolBar::AddImageList function to set an image list
	// then CoolBar will take care about creating, saving and
	// destroying of that image list object
	rbi.SetImageList(m_wndCoolBar.AddImageList(IDR_COOLBAR_IMAGELIST));
	if(!m_wndCoolBar.SetBarInfo(&rbi))
	{
		TRACE(_T("Failed to set CoolBar info\n"));
		return -1;      // fail to insert
	} 

	// attaching toolbars to Coolbar
	// the only way to attach any window to the Coolbar
	// is to create object of COXCoolBarBandInfo class,
	// set all properties and insert it into the CoolBar
	COXCoolBarBandInfo rbbi;
	// we want the background bitmap does not move 
	// when the band is resized
	rbbi.SetStyle(RBBS_FIXEDBMP);
	// set the CoolToolBar as child window
	rbbi.SetChildWindow(&m_wndToolBarFile);
	// set the CoolToolBar window min size
	// the first argument is width and the second is height
	rbbi.SetChildWindowMinSize(m_wndToolBarFile.CalcDynamicLayout(-1,0).cx,
		m_wndToolBarFile.CalcDynamicLayout(-1,LM_HORZ).cy-4);
	// set background bitmap
	// if you call COXCoolBar::AddBitmap function to add bitmap
	// then CoolBar will take care about creating, saving and
	// destroying of bitmap object
	rbbi.SetBackgroundBitmap(m_wndCoolBar.AddBitmap(IDB_COOLBAR_WALLPAPER));
	// set the text to the band
	rbbi.SetText(_T("File Toolbar"));
	// set the zero based index number in image list associated with CoolBar
	rbbi.SetImage(0);
	// you have to set to the band an unique, non zero ID
	rbbi.SetID(ID_VIEW_TOOLBAR_FILE);
	// try to insert the band
	if(!m_wndCoolBar.InsertBand((UINT)-1,&rbbi))
	{
		TRACE(_T("Failed to insert band\n"));
		return -1;      // fail to insert
	} 


	// as far as we use the same COXCoolBarBandInfo object
	// we have to change only a few properties.
	// Using COXCoolBarBandInfo::Reset() function you can reset
	// COXCoolBarBandInfo object

	// we want this band to be displayed on the next line
	rbbi.SetStyle(RBBS_FIXEDBMP|RBBS_BREAK);
	// set the CoolToolBar as child window
	rbbi.SetChildWindow(&m_wndToolBarEdit);
	// set the CoolToolBar window min size
	// the first argument is width and the second is height
	rbbi.SetChildWindowMinSize(m_wndToolBarEdit.CalcDynamicLayout(-1,0).cx,
		m_wndToolBarEdit.CalcDynamicLayout(-1,LM_HORZ).cy-4);
	// set the zero based index number in image list associated with CoolBar
	rbbi.SetImage(1);
	// set the text to the band
	rbbi.SetText(_T("Edit Toolbar"));
	// you have to set to the band an unique, non zero ID
	rbbi.SetID(ID_VIEW_TOOLBAR_EDIT);
	// try to insert the band
	if(!m_wndCoolBar.InsertBand((UINT)-1,&rbbi))
	{
		TRACE(_T("Failed to insert band\n"));
		return -1;      // fail to insert
	} 

	// as far as we use the same COXCoolBarBandInfo object
	// we have to change only a few properties

	// set the CoolToolBar as child window
	rbbi.SetChildWindow(&m_wndToolBarWindow);
	// set the CoolToolBar window min size
	// the first argument is width and the second is height
	rbbi.SetChildWindowMinSize(m_wndToolBarWindow.CalcDynamicLayout(-1,0).cx,
		m_wndToolBarWindow.CalcDynamicLayout(-1,LM_HORZ).cy-4);
	// set the zero based index number in image list associated with CoolBar
	rbbi.SetImage(2);
	// set the text to the band
	rbbi.SetText(_T("Window Toolbar"));
	// you have to set to the band an unique, non zero ID
	rbbi.SetID(ID_VIEW_TOOLBAR_WINDOW);
	// try to insert the band
	if(!m_wndCoolBar.InsertBand((UINT)-1,&rbbi))
	{
		TRACE(_T("Failed to insert band\n"));
		return -1;      // fail to insert
	} 


	// Let the menu organizer fix our menus
	Organizer.AttachFrameWnd(this);
	// use button from toolbars with corresponding items in menu
	Organizer.AutoSetMenuImage();

	return 0;
}

void CMainFrame::OnClose() 
{
	// TODO: Add your message handler code here and/or call default

	// before close save the workspace
	SaveWorkspace();

	CMainFrameWindow::OnClose();
}

void CMainFrame::SaveWorkspace() 
{
	// save the state of all bands within CoolBar
	m_wndCoolBar.SaveState(_T("CoolBar"));

	// save states of all CoolToolBar
	m_wndToolBarFile.SaveBarState(_T("CoolToolBars"),_T("File"));
	m_wndToolBarEdit.SaveBarState(_T("CoolToolBars"),_T("Edit"));
	m_wndToolBarWindow.SaveBarState(_T("CoolToolBars"),_T("Window"));

	// save the state of all bars within framework
	SaveBarState(_T("FrameworkBarState"));
}

void CMainFrame::LoadWorkspace() 
{
	LockWindowUpdate();

	// load all bars state in framework
	LoadBarState(_T("FrameworkBarState"));

	// load state of all CoolToolBar
	m_wndToolBarFile.LoadBarState(_T("CoolToolBars"),_T("File"));
	m_wndToolBarEdit.LoadBarState(_T("CoolToolBars"),_T("Edit"));
	m_wndToolBarWindow.LoadBarState(_T("CoolToolBars"),_T("Window"));

	// load the state of all bands within CoolBar
	m_wndCoolBar.LoadState(_T("CoolBar"));

	UnlockWindowUpdate();
}


void CMainFrame::OnViewCustomize() 
{
	// TODO: Add your command handler code here

	CCustomizeDlg dlgCustomize(this);
	dlgCustomize.arrCustomize[0]=GetToolbarProperties(&m_wndToolBarFile);
	dlgCustomize.arrCustomize[1]=GetToolbarProperties(&m_wndToolBarEdit);
	dlgCustomize.arrCustomize[2]=GetToolbarProperties(&m_wndToolBarWindow);

	if(dlgCustomize.DoModal()==IDOK)
	{
		LockWindowUpdate();

		SetToolbarProperties(&m_wndToolBarFile,dlgCustomize.arrCustomize[0]);
		SetToolbarProperties(&m_wndToolBarEdit,dlgCustomize.arrCustomize[1]);
		SetToolbarProperties(&m_wndToolBarWindow,dlgCustomize.arrCustomize[2]);

		// we applied all changes in SetToolbarProperties function
		// but I believe due to the bug in common control dll when we
		// change band's text from non empty string to empty one the system 
		// doesn't recalculate the size of the band.
		// Workaround is to repopulate Coolbar
		COXCoolBarBandInfo biFirst;
		COXCoolBarBandInfo biSecond;
		COXCoolBarBandInfo biThird;
		int nBand;
		int nBackward;
		// save all CoolBar's bands info
		if(m_wndCoolBar.GetBandInfo(0,&biFirst) && m_wndCoolBar.GetBandInfo(1,&biSecond) && 
			m_wndCoolBar.GetBandInfo(2,&biThird))
		{
			// delete all bands
			for(nBand=0; nBand<3; nBand++)
			{
				if(!m_wndCoolBar.DeleteBand(0))
				{
					break;
				}
			}
			// insert saved bands in back order to make sure
			// the initial width of bands will stay the same
			for(nBackward=nBand-1; nBackward>=0; nBackward--)
			{
				switch(nBackward)
				{
				case 0:
					{
						m_wndCoolBar.InsertBand(0,&biFirst);
						break;
					}
				case 1:
					{
						m_wndCoolBar.InsertBand(0,&biSecond);
						break;
					}
				case 2:
					{
						m_wndCoolBar.InsertBand(0,&biThird);
						break;
					}
				}
			}
		}

		UnlockWindowUpdate();
	}
}

CustomizeBand CMainFrame::GetToolbarProperties(COXCoolToolBar* pBar)
{
	// collect information about CoolBar's band and 
	// corresponding CoolToolBar to use in Customize Toolbars dialog
	CustomizeBand ct;
	ct.bCustomizable=pBar->IsCustomizable();
	ct.bFlat=pBar->IsFlat();
	ct.bList=pBar->IsList();
	ct.bSeparator=pBar->IsSeparator();
	ct.bText=!pBar->GetButtonText(0).IsEmpty();
	ct.nTextType=(int)pBar->GetTextType();
	ct.nRows=pBar->GetTextRows();
	ct.nWidth=pBar->GetButtonsSize().cx;

	UINT nBand;
	if(!m_wndCoolBar.GetBandNumber(pBar->GetDlgCtrlID(),nBand))
	{
		ct.nImage=-1;
		ct.sBandText=CString(_T(""));
	}
	else
	{
		if(!m_wndCoolBar.GetBandImage(nBand,ct.nImage))
		{
			ct.nImage=-1;
		}
		CString sText;
		if(!m_wndCoolBar.GetBandText(nBand,sText))
		{
			ct.sBandText=CString(_T(""));
		}
		else
		{
			ct.sBandText=sText;
		}
	}

	return ct;
}

void CMainFrame::SetToolbarProperties(COXCoolToolBar* pBar, CustomizeBand ct)
{
	// change styles and properties of CoolToolBar
	pBar->SetCustomizable(ct.bCustomizable);
	pBar->SetFlat(ct.bFlat);
	pBar->SetList(ct.bList);
	pBar->SetSeparator(ct.bSeparator);
	if(ct.bText)
	{
		pBar->SetButtonTextFromID((COXCoolToolBar::TextTypeFromID)ct.nTextType);
		pBar->SetMaxTextRows(ct.nRows);
		pBar->SetButtonsMinMaxWidth(0,ct.nWidth);
		pBar->UpdateSizes();
	}
	else
	{
		// if we don't want to use text in CoolToolBar then 
		// remove all previously associated text
		pBar->SetButtonTextFromID(COXCoolToolBar::TTID_NONE);
		pBar->SetButtonTextFromID(COXCoolToolBar::TTID_NOTSET);
		pBar->SetMaxTextRows(0);
		pBar->SetButtonsMinMaxWidth(0,24);
		pBar->IniSizes(CSize(16,16));
	}

	// change the CoolBar's band properties
	UINT nBand;
	if(m_wndCoolBar.GetBandNumber(pBar->GetDlgCtrlID(),nBand))
	{
		// change the text associated with the band
		CString sText;
		sText=ct.sBandText;
		try
		{
			m_wndCoolBar.SetBandText(nBand,sText.GetBuffer(sText.GetLength()));
			sText.ReleaseBuffer();
		}
		catch(CMemoryException* e)
		{
			AfxMessageBox(_T("Out of memory!"),MB_ICONSTOP);
			e->Delete();
		}

		// change the number of index in CoolBar's image list
		m_wndCoolBar.SetBandImage(nBand,ct.nImage);

		// the size of CoolToolBar could have changed 
		// then reset the min Chid Window Size
		CSize sizeChild;
		if(m_wndCoolBar.GetBandChildWindowMinSize(nBand,sizeChild))
		{
			sizeChild=pBar->GetButtonsSize();
			m_wndCoolBar.SetBandChildWindowMinSize(nBand,
				pBar->CalcDynamicLayout(-1,0).cx,
				sizeChild.cy+4);
		}

	}

	CRect rect;
	pBar->GetWindowRect(&rect);
	// resize window 
	pBar->SetWindowPos(NULL,0,0,rect.Width(),rect.Height(),
		SWP_NOMOVE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED);

	// it is up to framework to reallocate all other control bars
	CFrameWnd* pFrameWnd=pBar->GetDockingFrame();
	if(pFrameWnd!=NULL)
	{
		pFrameWnd->RecalcLayout();
	}
}


/////////////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNCREATE(CPadDoc, CDocument)
BEGIN_MESSAGE_MAP(CPadDoc, CDocument)
	//{{AFX_MSG_MAP(CPadDoc)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CPadDoc::Serialize(CArchive& ar)
{
	((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);
}

/////////////////////////////////////////////////////////////////////////////

void CMainFrame::OnUpdateCoolbar(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CControlBar* pBar=GetControlBar(pCmdUI->m_nID);
	if(pBar!=NULL)
	{
		pCmdUI->SetCheck((pBar->GetStyle() & WS_VISIBLE) != 0);
		return;
	}
}

void CMainFrame::OnCoolbar() 
{
	// TODO: Add your command handler code here
	
	CControlBar* pBar = (CControlBar*)&m_wndCoolBar;
	if (pBar != NULL)
	{
		ShowControlBar(pBar, (pBar->GetStyle() & WS_VISIBLE) == 0, FALSE);
	}
}

#if _MFC_VER>=0x0420
//////////////////////
// custom draw of a toolbar is available since MFC 4.2
// in you derived class you can provide your own custom draw routines
afx_msg void CMainFrame::OnCustomDraw(NMHDR* pNotify, LRESULT* pResult)
{
	LPNMCUSTOMDRAW pCDRW;
	pCDRW=(LPNMCUSTOMDRAW)pNotify;

	*pResult = CDRF_DODEFAULT;
	switch( pCDRW->dwDrawStage )
	{
	case CDDS_PREPAINT:
		{
			*pResult=CDRF_NOTIFYITEMDRAW;
			break;
		}
	case CDDS_ITEMPREPAINT:
		{
			*pResult=CDRF_NEWFONT;

			CDC dc;
			dc.Attach(pCDRW->hdc);

			CFont* pFont=dc.GetCurrentFont();
			if(pFont)
			{
				LOGFONT lf;
				VERIFY(pFont->GetLogFont(&lf));
				if(lf.lfWeight!=1000)
					lf.lfWeight=1000;
				lf.lfHeight=-24;
				if((HFONT)m_CoolbarFont)
					m_CoolbarFont.DeleteObject();
				VERIFY(m_CoolbarFont.CreateFontIndirect(&lf));
			}
			else
				TRACE(_T("CMainFrame::OnCustomDraw: failed to get DC font"));

			dc.Detach();

			if((HFONT)m_CoolbarFont)
				::SelectObject(pCDRW->hdc, (HFONT)m_CoolbarFont);
			::SetTextColor(pCDRW->hdc, RGB(255,0,0));
			break;
		}
	default:
		{
			TRACE(_T("Unknown draw stage ...\n"));
			break;
		}
	}
}
//////////////////////
#endif

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 Code Project Open License (CPOL)


Written By
Web Developer
Canada Canada
In January 2005, David Cunningham and Chris Maunder created TheUltimateToolbox.com, a new group dedicated to the continued development, support and growth of Dundas Software’s award winning line of MFC, C++ and ActiveX control products.

Ultimate Grid for MFC, Ultimate Toolbox for MFC, and Ultimate TCP/IP have been stalwarts of C++/MFC development for a decade. Thousands of developers have used these products to speed their time to market, improve the quality of their finished products, and enhance the reliability and flexibility of their software.
This is a Organisation

476 members

Comments and Discussions