Dialog AND a custom Toolbar
Hi,
I used some code from the book Visual C++ 4.0 HowTo, to add a toolbar
to my dialog.
The code is :
void CClientToolBar::OnNeedText (NMHDR* pNotifyStruct, LRESULT*
result)
{
LPTOOLTIPTEXT lpTipText = (LPTOOLTIPTEXT) pNotifyStruct;
UINT nStringID = lpTipText->hdr.idFrom;
TCHAR szFullText[256];
CString strTipText;
AfxLoadString(nStringID,szFullText);
AfxExtractSubString(strTipText,szFullText,1,'\n');
strcpy(lpTipText->lpszText,strTipText);
*result = TRUE;
}
struct CToolBarData
{
WORD wVersion;
WORD wWidth;
WORD wHeight;
WORD wItemCount;
WORD* items()
{ return (WORD*) (this+1); }
};
BOOL CClientToolBar::LoadToolBar (UINT nIDResource)
{
ASSERT_VALID(this);
ASSERT(nIDResource != 0);
HINSTANCE hInst = AfxGetInstanceHandle();
HRSRC hRsrc
= ::FindResource(hInst,MAKEINTRESOURCE(nIDResource),RT_TOOLBAR);
if(hRsrc == NULL)
return FALSE;
HGLOBAL hGlobal = LoadResource(hInst,hRsrc);
if (hGlobal == NULL)
return FALSE;
CToolBarData* pData = (CToolBarData*) LockResource(hGlobal);
if(pData == NULL)
return FALSE;
ASSERT(pData->wVersion == 1);
if(AddBitmap(pData->wItemCount , nIDResource) == -1)
{
UnlockResource(hGlobal);
FreeResource(hGlobal);
return FALSE;
}
UINT* pItems = new UINT[pData->wItemCount ];
for (int i = 0; i< pData ->wItemCount ; i++)
pItems[i] = pData->items ()[i];
BOOL bResult = SetButtons(pItems,pData->wItemCount );
delete[] pItems;
if(bResult)
{
CSize sizeImage(pData->wWidth , pData->wHeight);
CSize sizeButton(pData->wWidth +14, pData->wHeight + 7);
SetBitmapSize(sizeImage);
SetBitmapSize(sizeButton);
}
UnlockResource(hGlobal);
FreeResource(hGlobal);
return bResult;
}
BOOL CClientToolBar::SetButtons(const UINT* lpIDArray, int nIDCount)
{
ASSERT_VALID(this);
ASSERT(nIDCount >= 1);
ASSERT(lpIDArray == NULL || AfxIsValidAddress(lpIDArray, sizeof(UINT)
*nIDCount,FALSE));
int nCount = GetButtonCount();
while(nCount)
VERIFY(DeleteButton(0));
if(lpIDArray != NULL)
{
TBBUTTON button; memset(&button, 0, sizeof(TBBUTTON));
int iImage = 0;
for(int i = 0; i<nIDCount; i++)
{
button.fsState = TBSTATE_ENABLED;
if((button.idCommand = *lpIDArray++) == 0)
{
button.fsStyle = TBSTYLE_SEP;
button.iBitmap = 8;
}
else
{
button.fsStyle = TBSTYLE_BUTTON;
button.iBitmap = iImage++;
}
if(!AddButtons(1,&button))
return FALSE;
}
}
else
{
TBBUTTON button; memset(&button,0,sizeof(TBBUTTON));
button.fsState = TBSTATE_ENABLED;
for(int i = 0; i<nIDCount; i++)
{
ASSERT(button.fsStyle == TBSTYLE_BUTTON);
if(!AddButtons(1,&button))
return FALSE;
}
}
return TRUE;
}
void CClientToolBar::OnToolbarChat()
{
// TODO: Add your command handler code here
THIS GETS CALLED
}
void CClientToolBar::OnUpdateToolbarChat(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
THIS IS NEVER CALLED !!!!
}
In the dialog OnInitDialog():
CRect r(0,0,0,0);
o_ClientToolBar.Create (WS_VISIBLE|WS_CHILD|CCS_TOP|CCS_ADJUSTABLE |
TBSTYLE_TOOLTIPS,r,this,IDR_TOOLBAR1);
o_ClientToolBar.LoadToolBar (IDR_TOOLBAR1);
o_ClientToolBar.AutoSize ();
The Toolbar is added but the UPDATE_COMMAND_UI message is never
called.
What do i have to do to make this work ?
I want to SetCheck() the toolbar button when pressed.