710 lines
20 KiB
C++
710 lines
20 KiB
C++
// 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
|
|
|