Adding Toolbar button in CFileDialog

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

This article will show you how to add a Toolbar button in CFileDialog’s Toolbar. Here is the sample code:


CONST LONG ID_NEW_BUTTON = 40790L; // Command ID of new
// Toolbar button.

class CFileDialogEx : public CFileDialog
{
DECLARE_DYNAMIC(CFileDialogEx)

public:
CFileDialogEx(BOOL bOpenFileDialog, // TRUE for FileOpen,
// FALSE for FileSaveAs

LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL);

protected:
virtual void OnInitDone();
void OnNewTBClick();

static LRESULT CALLBACK WindowProcNew(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam);

public:
static WNDPROC m_wndProc;
};

WNDPROC CFileDialogEx::m_wndProc;

IMPLEMENT_DYNAMIC(CFileDialogEx, CFileDialog)

CFileDialogEx:: CFileDialogEx (BOOL bOpenFileDialog,
LPCTSTR lpszDefExt,
LPCTSTR lpszFileName,
DWORD dwFlags,
LPCTSTR lpszFilter,
CWnd*
pParentWnd) :
CFileDialog(bOpenFileDialog,
lpszDefExt,
lpszFileName,
dwFlags,
lpszFilter,
pParentWnd)
{

}

void CFileDialogEx::OnInitDone()
{
CWnd* wndParent = GetParent();
ASSERT(wndParent != NULL);

// Display File dialog in center

wndParent->CenterWindow();

// Implementation of Toolbar in file dialog is
// in class “ToolbarWindow32”. We get the toolbar
// by looping through all CFileDialog child
// controls and getting their class name.

TCHAR strClassName[255];
CWnd* wndChild = wndParent->GetWindow(GW_CHILD);
while( wndChild != NULL )
{
// Get the class name of child control

::GetClassName(wndChild->GetSafeHwnd(), strClassName, 255);

// if child control is toolbar then we add a button in it.

if( _tcscmp(_T(“ToolbarWindow32”), strClassName) == 0 )
{
CToolBarCtrl* pToolbarCtrl = (CToolBarCtrl*)wndChild;
ASSERT(pToolbarCtrl != NULL);

// Get the number of buttons in existing
// toolbar control.

int nButCount = pToolbarCtrl->GetButtonCount();

// Add a new button in it.

IDB_NEW_BUTTON is a bitmap resource
pToolbarCtrl->AddBitmap(1, IDB_NEW_BUTTON);

// get the number of images in existing toolbar

int nImageCount =
pToolbarCtrl->GetImageList()->GetImageCount();

// Define a new button

TBBUTTON tb;

// Index of new button image.

tb.iBitmap = nImageCount-1;

// Command associated with toolbar button

tb.idCommand = ID_NEW_BUTTON;

// Setting button state

tb.fsState = TBSTATE_ENABLED;

// Setting button style

tb.fsStyle = TBSTYLE_BUTTON;
tb.dwData = 0;
tb.iString = NULL;

// Insert it in existing toolbar control

pToolbarCtrl->InsertButton(nButCount, &tb);
break;
}

wndChild = wndChild->GetNextWindow();
}

// setup parent window procedure to capture the
// mouse click event of Toolbar button//

m_wndProc = (WNDPROC)SetWindowLong(wndParent->GetSafeHwnd(),
GWL_WNDPROC,
(LONG)CFileDialogEx::WindowProcNew);
}

static CFileDialogEx* GetFileDlg (HWND hwdParent)
{
CFileDialog* pDlg =
(CFileDialog*)CWnd::FromHandle (hwdParent);
ASSERT (pDlg != NULL);

CFileDialogEx* pFD = (CFileDialogEx*) pDlg->GetDlgItem(0);
ASSERT (pFD != NULL);

return pFD;
}

LRESULT CALLBACK CFileDialogEx::WindowProcNew(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
if ( (LONG) LOWORD(wParam) == ID_NEW_BUTTON )
{
CFileDialogEx * pFD = GetFileDlg(hwnd);
pFD->OnNewTBClick ();
return 0;
}
}

return CallWindowProc(CFileDialogEx::m_wndProc,
hwnd,
message,
wParam,
lParam);
}

void CFileDialogEx::OnNewTBClick ()
{
AfxMessageBox(“You clicked on new Toolbar button”);
}

Downloads

Download demo project – 20 Kb

Download source – 3 Kb

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read