www.pudn.com > tabctr.rar > PaletteBar.cpp


// PaletteBar.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Exam10_25.h" 
#include "PaletteBar.h" 
#include "afxpriv.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CPaletteBar 
 
CPaletteBar::CPaletteBar() : m_pTBButtons(NULL) 
{ 
 
} 
 
CPaletteBar::~CPaletteBar() 
{ 
	if (m_pTBButtons) 
		delete []m_pTBButtons; 
 
} 
 
 
BEGIN_MESSAGE_MAP(CPaletteBar, CToolBarCtrl) 
	//{{AFX_MSG_MAP(CPaletteBar) 
	ON_NOTIFY_RANGE( TTN_NEEDTEXTA, ID_ERASE, ID_ELLIPSE, OnNeedTextA) 
	ON_NOTIFY_RANGE( TTN_NEEDTEXTW, ID_ERASE, ID_ELLIPSE, OnNeedTextW) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
BOOL CPaletteBar::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ) 
{ 
	BOOL bRet = CToolBarCtrl::Create(dwStyle, rect, pParentWnd, nID); 
 
	m_nButtonCount = ID_ELLIPSE - ID_ERASE + 1; 
 
	VERIFY(AddBitmap(m_nButtonCount,IDR_PALETTEBAR) != -1); 
 
	m_pTBButtons = new TBBUTTON[m_nButtonCount]; 
 
	for (int nIndex = 0; nIndex < m_nButtonCount; nIndex++) 
	{ 
		CString string; 
		string.LoadString(nIndex + ID_ERASE); 
 
		// Add second '\0' 
		int nStringLength = string.GetLength() + 1; 
		TCHAR* pString = string.GetBufferSetLength(nStringLength); 
		pString[nStringLength] = 0; 
 
		VERIFY((m_pTBButtons[nIndex].iString = AddStrings(pString)) != -1); 
 
		string.ReleaseBuffer(); 
 
 
		m_pTBButtons[nIndex].fsState = TBSTATE_ENABLED; 
		m_pTBButtons[nIndex].fsStyle = TBSTYLE_CHECKGROUP; 
		m_pTBButtons[nIndex].dwData = 0; 
		m_pTBButtons[nIndex].iBitmap = nIndex; 
		m_pTBButtons[nIndex].idCommand = nIndex + ID_ERASE; 
 
	} 
 
 
	for (nIndex = 0; nIndex < m_nButtonCount; nIndex++) 
	{ 
		VERIFY(AddButtons(1,&m_pTBButtons[nIndex])); 
	} 
 
 
	return bRet; 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CPaletteBar message handlers 
 
// MFC routes the notifications sent to the parent of the control to 
// the control before the parent can process the notification. 
// The control object can handle the notification or ignore it. 
// If the notification is handled then return TRUE. Otherwise MFC 
// will route it to the parent of the control. 
 
BOOL CPaletteBar::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult) 
{ 
	if (message == WM_NOTIFY) 
	{ 
		NMHDR *pNMHDR = (NMHDR *) lParam; 
		switch (pNMHDR->code) 
		{ 
		case TBN_BEGINADJUST : 
			return BeginAdjust(wParam,  lParam,  pLResult); 
 
		case TBN_BEGINDRAG: 
			return BeginDrag(wParam,  lParam,  pLResult); 
 
		case TBN_CUSTHELP: 
			return CustomizeHelp(wParam,  lParam,  pLResult); 
 
		case TBN_ENDADJUST: 
			return EndAdjust(wParam,  lParam,  pLResult); 
 
		case TBN_ENDDRAG: 
			return EndDrag(wParam,  lParam,  pLResult); 
 
		case TBN_GETBUTTONINFO: 
			return GetButtonInfo(wParam,  lParam,  pLResult); 
 
		case TBN_QUERYDELETE: 
			return QueryDelete(wParam,  lParam,  pLResult); 
 
		case TBN_QUERYINSERT: 
			return QueryInsert(wParam,  lParam,  pLResult); 
 
		case TBN_RESET: 
			return Reset(wParam, lParam,  pLResult); 
 
		case TBN_TOOLBARCHANGE: 
			return ToolBarChange(wParam, lParam, pLResult); 
		} 
	} 
 
	return CToolBarCtrl::OnChildNotify(message, wParam, lParam, pLResult); 
} 
 
BOOL CPaletteBar::BeginAdjust(WPARAM wParam, LPARAM lParam, LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_BEGINADJUST\n")); 
 
	// the customize dialog box is about to be displayed 
 
	// save toolbar state before customization using the dialog 
	// Use this information to restore the state if reset button is pressed 
	SaveState(HKEY_CURRENT_USER,_T("Software\\Microsoft\\VC40\\Samples\\CtrlDemo"),_T("Palette Tool Bar")); 
 
	return TRUE; 
} 
 
BOOL CPaletteBar::BeginDrag(WPARAM wParam, LPARAM  lParam, LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_BEGINDRAG\n")); 
 
	// we are not implementing custon drag and drop 
	* pLResult = FALSE; 
	return FALSE; 
} 
 
BOOL CPaletteBar::CustomizeHelp(WPARAM wParam, LPARAM  lParam, LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_CUSTHELP\n")); 
 
	// Sample displays a message box but a valid help topic 
	// can be displayed for the customize dialog for this toolbar 
	AfxMessageBox(_T("Help not implemented!")); 
 
	return TRUE; 
} 
 
BOOL CPaletteBar::EndAdjust(WPARAM wParam, LPARAM  lParam, LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_ENDADJUST\n")); 
 
	// the customize dialog box has been closed 
 
	return TRUE; 
} 
 
BOOL CPaletteBar::EndDrag(WPARAM wParam, LPARAM  lParam, LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_ENDDRAG\n")); 
 
	// Code to handle custom drag and drop. This message indicates that 
	// the item is being dropped 
	* pLResult = FALSE; 
	return TRUE; 
} 
 
BOOL CPaletteBar::GetButtonInfo(WPARAM wParam, LPARAM  lParam, LRESULT* pLResult) 
{ 
	// This notification message has to be handled correctly if 
	// all operations in the custom dialogbox has to function correctly 
	// We have to supply information for the button specified by pTBN->tbButton 
	// 
	// This notification is sent in the following cases 
	// 
	// After TBN_BEGINADJUST the control sends these notifications until 
	// * pLResult is TRUE. We have to supply valid values when this value is 
	// set to TRUE. Here the control is collecting information for all 
	// the buttons that have to be displayed in the dialog box 
	// 
	// The control sends this notification to get information about 
	// a button if the user is trying to add it to the toolbar or 
	// rearranging the buttons on the toolbar from within the dialog 
 
	TRACE(_T("TBN_GETBUTTONINFO\n")); 
 
	TBNOTIFY *pTBN = (TBNOTIFY *) lParam; 
 
	if (pTBN->iItem >= m_nButtonCount) 
	{ 
		* pLResult = FALSE; 
	} 
	else 
	{ 
		CString buffer; 
		buffer.LoadString(pTBN->iItem + ID_ERASE); 
 
		// set the string for the button 
		// truncate the string if its length is greater than the buffer 
		// supplied by the toolbar 
		_tcsncpy(pTBN->pszText, buffer, pTBN->cchText - 1); 
		pTBN->pszText[pTBN->cchText - 1] = '\0'; 
 
		// set the button info 
		pTBN->tbButton = m_pTBButtons[pTBN->iItem]; 
 
		// valid values are structure 
		*pLResult = TRUE; 
	} 
 
	return TRUE; 
} 
 
BOOL CPaletteBar::QueryDelete(WPARAM wParam, LPARAM  lParam, LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_QUERYDELETE\n")); 
 
	// in this sample any button can be deleted 
	// if a particular button cannot be deleted set *pResult to FALSE for that item 
	*pLResult = TRUE; 
	return TRUE; 
} 
 
BOOL CPaletteBar::QueryInsert(WPARAM wParam, LPARAM  lParam, LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_QUERYINSERT\n")); 
 
	// in this sample buttons can be inserted at any location on the 
	// toolbar 
	*pLResult = TRUE; 
	return TRUE; 
} 
 
BOOL CPaletteBar::Reset(WPARAM wParam, LPARAM lParam, LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_RESET\n")); 
 
	// User has pressed the reset button 
	// restore the state of the toolbar to the state it was before customization 
	RestoreState(HKEY_CURRENT_USER,_T("Software\\Microsoft\\VC40\\Samples\\CtrlDemo"),_T("Palette Tool Bar")); 
 
	*pLResult = TRUE; 
	return TRUE; 
} 
 
BOOL CPaletteBar::ToolBarChange(WPARAM wParam, LPARAM lParam,LRESULT* pLResult) 
{ 
	TRACE(_T("TBN_TOOLBARCHANGE\n")); 
 
	// the toolbar has changed 
	return TRUE; 
} 
 
 
// Helper function for tooltips 
 
CString CPaletteBar::NeedText( UINT nID, NMHDR * pNotifyStruct, LRESULT * lResult ) 
{ 
	LPTOOLTIPTEXT lpTTT = (LPTOOLTIPTEXT)pNotifyStruct ; 
	ASSERT(nID == lpTTT->hdr.idFrom); 
 
	CString toolTipText; 
	toolTipText.LoadString(nID); 
 
	// szText length is 80 
	int nLength = (toolTipText.GetLength() > 79) ? 79 : toolTipText.GetLength(); 
 
	toolTipText = toolTipText.Left(nLength); 
 
	return toolTipText; 
} 
 
 
void CPaletteBar::OnNeedTextW( UINT nID, NMHDR * pNotifyStruct, LRESULT * lResult ) 
{ 
	CString toolTipText = NeedText(nID, pNotifyStruct, lResult); 
 
	LPTOOLTIPTEXTW lpTTT = (LPTOOLTIPTEXTW)pNotifyStruct; 
 
#ifdef _UNICODE 
	_tcsncpy(lpTTT->szText,(LPCTSTR)toolTipText, toolTipText.GetLength() + 1); 
#else 
	mbstowcs(lpTTT->szText,(LPCTSTR)toolTipText, toolTipText.GetLength() + 1); 
#endif 
} 
 
void CPaletteBar::OnNeedTextA( UINT nID, NMHDR * pNotifyStruct, LRESULT * lResult ) 
{ 
	CString toolTipText = NeedText(nID, pNotifyStruct, lResult); 
 
	LPTOOLTIPTEXT lpTTT = (LPTOOLTIPTEXT)pNotifyStruct; 
 
	_tcscpy(lpTTT->szText,(LPCTSTR)toolTipText); 
} 
 
 
/////////////////////////////////////////////////////////////////////// 
// This has been overridden so we can handle the tooltip TTN_NEEDTEXT// 
// notification message                                              // 
/////////////////////////////////////////////////////////////////////// 
 
BOOL CPaletteBar::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{ 
	ASSERT(pResult != NULL); 
	NMHDR* pNMHDR = (NMHDR*)lParam; 
	HWND hWndCtrl = pNMHDR->hwndFrom; 
 
	// get the child ID from the window itself 
	// UINT nID = _AfxGetDlgCtrlID(hWndCtrl); 
 
	////////////////////////////////////////////////////////////////// 
	// If TTN_NEEDTEXT we cannot get the ID from the tooltip window // 
	////////////////////////////////////////////////////////////////// 
 
	int nCode = pNMHDR->code; 
 
	// 
	// if it is the following notification message 
	// nID has to obtained from wParam 
	// 
 
	if (nCode == TTN_NEEDTEXTA || nCode == TTN_NEEDTEXTW) 
	{ 
		UINT nID;   // = _AfxGetDlgCtrlID(hWndCtrl); 
		nID = (UINT)wParam; 
 
 
		ASSERT((UINT)pNMHDR->idFrom == (UINT)wParam); 
		UNUSED(wParam);  // not used in release build 
		ASSERT(hWndCtrl != NULL); 
		ASSERT(::IsWindow(hWndCtrl)); 
 
		if (AfxGetThreadState()->m_hLockoutNotifyWindow == m_hWnd) 
			return TRUE;        // locked out - ignore control notification 
 
	// reflect notification to child window control 
		if (ReflectLastMsg(hWndCtrl, pResult)) 
			return TRUE;        // eaten by child 
 
		AFX_NOTIFY notify; 
		notify.pResult = pResult; 
		notify.pNMHDR = pNMHDR; 
		return OnCmdMsg(nID, MAKELONG(nCode, WM_NOTIFY), ¬ify, NULL); 
	} 
 
	return CToolBarCtrl::OnNotify(wParam, lParam, pResult); 
}