📄 toolbarctrl.cpp
字号:
// ToolBarCtrl.cpp : implementation file//#include "stdafx.h"#include "fusion.h"#include "ToolBarCtrl.h"#include "FusionColorUI.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifstruct CToolBarData{ WORD wVersion; WORD wWidth; WORD wHeight; WORD wItemCount; WORD* items() { return (WORD*)(this+1); }};/////////////////////////////////////////////////////////////////////////////// RxToolCmdUIclass RxToolCmdUI : public CCmdUI{public: // re-implementations only virtual void Enable(BOOL bOn); virtual void SetCheck(int nCheck);};void RxToolCmdUI::Enable(BOOL bOn){ m_bEnableChanged = TRUE; RxToolBarCtrl* pToolBar = (RxToolBarCtrl *)m_pOther; if(pToolBar->GetButtonVisible(m_nIndex)) pToolBar->SetButtonEnable(m_nIndex, bOn);}void RxToolCmdUI::SetCheck(int nCheck){ RxToolBarCtrl* pToolBar = (RxToolBarCtrl *)m_pOther; if(pToolBar->GetButtonVisible(m_nIndex)) pToolBar->SetButtonCheck(m_nIndex, nCheck);}/////////////////////////////////////////////////////////////////////////////// RxToolBarCtrlRxToolBarCtrl::RxToolBarCtrl(){ m_ArrayButton.SetSize(0, 8); m_nMouseOverButton = -1;}RxToolBarCtrl::~RxToolBarCtrl(){}BEGIN_MESSAGE_MAP(RxToolBarCtrl, CWnd) //{{AFX_MSG_MAP(RxToolBarCtrl) ON_WM_PAINT() ON_WM_LBUTTONDOWN() ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP ON_MESSAGE_VOID(WM_INITIALUPDATE, OnInitialUpdate) ON_MESSAGE(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify) ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// RxToolBarCtrl message handlersBOOL RxToolBarCtrl::LoadToolBar(UINT nIDResource, UINT nNBimapID, UINT nSBitmapID, UINT nDBitmapID){ // load tool bar resource LPCTSTR lpszResourceName = MAKEINTRESOURCE(nIDResource); ASSERT_VALID(this); ASSERT(lpszResourceName != NULL); // determine location of the bitmap in resource fork HINSTANCE hInst = AfxFindResourceHandle(lpszResourceName, RT_TOOLBAR); HRSRC hRsrc = ::FindResource(hInst, lpszResourceName, 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); RX_TBBUTTON *pButton; for (int i = 0; i < pData->wItemCount; i++) { pButton = new RX_TBBUTTON; pButton->nID = pData->items()[i]; pButton->wStatus[0] = 0; pButton->wStatus[1] = 0; pButton->wStatus[2] = 0; m_ArrayButton.Add(pButton); } UnlockResource(hGlobal); FreeResource(hGlobal); // load bitmap resource if(m_bmpNormal.m_hObject) m_bmpNormal.DeleteObject(); m_bmpNormal.LoadBitmap(nNBimapID); if(m_bmpSelect.m_hObject) m_bmpSelect.DeleteObject(); m_bmpSelect.LoadBitmap(nSBitmapID); if(m_bmpDisable.m_hObject) m_bmpDisable.DeleteObject(); m_bmpDisable.LoadBitmap(nDBitmapID); return TRUE;}void RxToolBarCtrl::PostNcDestroy() { CWnd::PostNcDestroy(); RemoveAllButton(); delete this;}/////////////////////////////////////////////////////////////////////////////void RxToolBarCtrl::OnInitialUpdate(){ EnableToolTips(); OnIdleUpdateCmdUI(TRUE, 0L);}LRESULT RxToolBarCtrl::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM){ if (GetStyle() & WS_VISIBLE) { CFrameWnd* pTarget = (CFrameWnd*)GetOwner(); if (pTarget == NULL || !pTarget->IsFrameWnd()) pTarget = GetParentFrame(); if (pTarget != NULL) OnUpdateCmdUI(pTarget, (BOOL)wParam); } return 0L;}void RxToolBarCtrl::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler){ RxToolCmdUI state; state.m_pOther = this; state.m_nIndexMax = GetButtonCount(); for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++) { RX_TBBUTTON *pButton = GetButton(state.m_nIndex); state.m_nID = pButton->nID; // ignore separators and visible button if(state.m_nID != IDTB_SEPARATOR || (pButton->wStatus[0] & RXTBS1_VISIBLE)) { // allow reflections if (CWnd::OnCmdMsg(0, MAKELONG((int)CN_UPDATE_COMMAND_UI, WM_COMMAND+WM_REFLECT_BASE), &state, NULL)) continue; // allow the toolbar itself to have update handlers if (CWnd::OnCmdMsg(state.m_nID, CN_UPDATE_COMMAND_UI, &state, NULL)) continue; // allow the owner to process the update state.DoUpdate(pTarget, bDisableIfNoHndler); } } // update the dialog controls added to the toolbar UpdateDialogControls(pTarget, bDisableIfNoHndler);}/////////////////////////////////////////////////////////////////////////////// Tooltip Functions.int RxToolBarCtrl::OnToolHitTest(CPoint point, TOOLINFO* pTI) const{ // check child windows first by calling CWnd int nHitTest = CWnd::OnToolHitTest(point, pTI); if (nHitTest != -1) return nHitTest; RECT rect; nHitTest = HitTest(point, &rect); int nID = -1; if(nHitTest != -1 && pTI != NULL) { nID = ((RX_TBBUTTON *)m_ArrayButton.GetAt(nHitTest))->nID; pTI->hwnd = m_hWnd; pTI->rect = rect; pTI->uId = nID; pTI->lpszText = LPSTR_TEXTCALLBACK; } // found matching rect, return the ID of the button return nID;}// show tool tip messageBOOL RxToolBarCtrl::OnToolTipNotify(UINT id, NMHDR * pNMHDR, LRESULT * pResult){ TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; UINT nID = pNMHDR->idFrom; if(nID) { pTTT->lpszText = MAKEINTRESOURCE(nID); pTTT->hinst = AfxGetResourceHandle(); return TRUE; } return FALSE;}int RxToolBarCtrl::HitTest(CPoint point, LPRECT rect1) const{ CRect rect; CPoint ptOrg, ptTar; ptOrg.x = 8; ptOrg.y = 14; // 滚瓢甸狼 盔痢 ptTar.x = ptOrg.x; ptTar.y = ptOrg.y; // 角力 拳搁惑狼 滚瓢狼 困摹 int nButtonCount = m_ArrayButton.GetSize(); RX_TBBUTTON *pButton; for(int i = 0; i < nButtonCount; i++) { pButton = (RX_TBBUTTON *)m_ArrayButton.GetAt(i); if(pButton->nID == IDTB_SEPARATOR) { ptTar.x = ptOrg.x; ptTar.y += (RX_TOOL_SEPARATOR*2) + RX_TOOL_GAB; } else { if(pButton->wStatus[0] & RXTBS1_VISIBLE) { rect.SetRect(ptTar.x-3, ptTar.y-3, ptTar.x+pButton->wStatus[2]+3, ptTar.y+pButton->wStatus[3]+3); if(rect.PtInRect(point)) { if(rect1 != NULL) { rect1->left = rect.left; rect1->top = rect.top; rect1->right = rect.right; rect1->bottom = rect.bottom; } return i; } if(pButton->wStatus[0] & RXTBS1_WRAPPED) { ptTar.x = ptOrg.x; ptTar.y += pButton->wStatus[3] + RX_TOOL_GAB; } else ptTar.x += pButton->wStatus[2] + RX_TOOL_GAB; } } } return -1;}/////////////////////////////////////////////////////////////////////////////// 付快胶 捞亥飘// 滚瓢 努腐饶 器目胶巩力, mouse move巩力 歹 毫具凳void RxToolBarCtrl::OnLButtonDown(UINT nFlags, CPoint point) { int nHitTest; if((nHitTest = HitTest(point)) < 0) { CWnd::OnLButtonDown(nFlags, point); return; } RX_TBBUTTON *pButton = GetButton(nHitTest); if(pButton->wStatus[0] & RXTBS1_DISABLE) { CWnd::OnLButtonDown(nFlags, point); return; } pButton->wStatus[1] = RXTBS2_SELECT; DrawToolButton(nHitTest); BOOL bCancelLBtnDown = FALSE; SetCapture(); m_nMouseOverButton = -1; for (;;) { MSG msg; VERIFY(::GetMessage(&msg, NULL, 0, 0)); ScreenToClient(&msg.pt); switch (msg.message) { case WM_MOUSEMOVE : if(nHitTest == HitTest(msg.pt)) { if(bCancelLBtnDown) { pButton->wStatus[1] = RXTBS2_SELECT; DrawToolButton(nHitTest); bCancelLBtnDown = FALSE; } } else { if(!bCancelLBtnDown) { pButton->wStatus[1] = RXTBS2_NORMAL; DrawToolButton(nHitTest); bCancelLBtnDown = TRUE; } } break; case WM_LBUTTONUP : goto EndLButtonDown; break; default : // just dispatch rest of the messages DispatchMessage(&msg); break; } }EndLButtonDown :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -