📄 toolbarctrl.cpp
字号:
ReleaseCapture(); pButton->wStatus[1] = RXTBS2_NORMAL; DrawToolButton(nHitTest); if(!bCancelLBtnDown) { CFrameWnd* pTarget = (CFrameWnd*)GetOwner(); if (pTarget == NULL || !pTarget->IsFrameWnd()) pTarget = GetParentFrame(); pTarget->SendMessage(WM_COMMAND, pButton->nID); }}void RxToolBarCtrl::OnMouseMove(UINT nFlags, CPoint point) { if(m_nMouseOverButton < 0) { m_nMouseOverButton = HitTest(point); if(m_nMouseOverButton > -1) { RX_TBBUTTON *pButton = GetButton(m_nMouseOverButton); if(!(pButton->wStatus[0] & RXTBS1_DISABLE) && !(pButton->wStatus[0] & RXTBS1_CHECKED)) { SetCapture(); pButton->wStatus[1] = RXTBS2_FOCUS; DrawToolButton(m_nMouseOverButton); } else m_nMouseOverButton = -1; } } if(m_nMouseOverButton > -1) { if(m_nMouseOverButton != HitTest(point)) { ReleaseCapture(); RX_TBBUTTON *pButton = GetButton(m_nMouseOverButton); pButton->wStatus[1] = RXTBS2_NORMAL; DrawToolButton(m_nMouseOverButton); m_nMouseOverButton = -1; } } CWnd::OnMouseMove(nFlags, point);}/////////////////////////////////////////////////////////////////////////////// Draw Functionsvoid RxToolBarCtrl::OnPaint() { CPaintDC dc(this); // device context for painting RedrawWnd(); // Do not call CWnd::OnPaint() for painting messages}void RxToolBarCtrl::RedrawWnd(){ CDC *pDC = GetDC(); CRect rcClient, rect; GetClientRect(rcClient); // fill the background CBrush brush, *pOldBrush; brush.CreateSolidBrush(RXCOLOR_11); pOldBrush = pDC->SelectObject(&brush); pDC->PatBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), PATCOPY); pDC->SelectObject(pOldBrush); brush.DeleteObject(); ReleaseDC(pDC); DrawToolButton();}void RxToolBarCtrl::DrawToolButton(int nIndex){ CDC *pDC = GetDC(); CRect rcClient, rect; GetClientRect(rcClient); // draw top grip line rect.SetRect(rcClient.left+5, rcClient.top, rcClient.right-5, rcClient.top+3); pDC->Draw3dRect(rect, RGB(255,255,255), RGB(124,124,124)); CPoint ptOrg, ptTar, ptSrc; ptOrg.x = 8; ptOrg.y = 14; // 滚瓢甸狼 盔痢 ptTar.x = ptOrg.x; ptTar.y = ptOrg.y; // 角力 拳搁惑狼 滚瓢狼 困摹 ptSrc.x = 0; ptSrc.y = 0; // bitmap狼 困摹甫 唱鸥辰促 RX_TBBUTTON *pButton; for(int i = 0; i < m_ArrayButton.GetSize(); i++) { pButton = (RX_TBBUTTON *)m_ArrayButton.GetAt(i); if(pButton->nID == IDTB_SEPARATOR) { ptSrc.x += pButton->wStatus[2]; ptTar.y += RX_TOOL_SEPARATOR; CPen pen, *pOldPen; pen.CreatePen(PS_SOLID, 1, RGB(124,124,124)); pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(rcClient.left +5, ptTar.y-1); pDC->LineTo(rcClient.right-5, ptTar.y-1); pen.DeleteObject(); pen.CreatePen(PS_SOLID, 1, RGB(255,255,255)); pDC->SelectObject(&pen); pDC->MoveTo(rcClient.left +5, ptTar.y); pDC->LineTo(rcClient.right-5, ptTar.y); pen.DeleteObject(); ptTar.x = ptOrg.x; ptTar.y += RX_TOOL_SEPARATOR + RX_TOOL_GAB; } else { if(pButton->wStatus[0] & RXTBS1_VISIBLE) { if(nIndex == -1) { if(pButton->wStatus[0] & RXTBS1_DISABLE) DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 4); else if(pButton->wStatus[0] & RXTBS1_CHECKED) DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 3); else if(pButton->wStatus[1] == RXTBS2_SELECT) DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 2); else if(pButton->wStatus[1] == RXTBS2_FOCUS) DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 1); else DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 0); } else if(nIndex == i) { if(pButton->wStatus[0] & RXTBS1_DISABLE) DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 4); else if(pButton->wStatus[0] & RXTBS1_CHECKED) DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 3); else if(pButton->wStatus[1] == RXTBS2_SELECT) DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 2); else if(pButton->wStatus[1] == RXTBS2_FOCUS) DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 1); else DrawBitmapButton(pDC, ptTar, ptSrc, CSize(pButton->wStatus[2], pButton->wStatus[3]), 0); ReleaseDC(pDC); return; } 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; } ptSrc.x += pButton->wStatus[2]; } } // draw bottom grip line rect.SetRect(rcClient.left+5, ptTar.y + 12, rcClient.right-5, ptTar.y + 15); pDC->Draw3dRect(rect, RGB(255,255,255), RGB(124,124,124)); ReleaseDC(pDC);}void RxToolBarCtrl::DrawBitmapButton(CDC *pDC, CPoint ptOrg, CPoint ptSrc, CSize size, int nStatus){ int nMargin = 3; // between bitmap & border CRect rect; rect.SetRect(ptOrg.x-nMargin, ptOrg.y-nMargin, ptOrg.x+size.cx+nMargin, ptOrg.y+size.cy+nMargin); rect.OffsetRect(-rect.left, -rect.top); CDC dcMem; dcMem.CreateCompatibleDC(pDC); CBitmap bmpMem, *pOldBitmap; bmpMem.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); pOldBitmap = dcMem.SelectObject(&bmpMem); CBrush brush, *pOldBrush; brush.CreateSolidBrush(RXCOLOR_11); pOldBrush = dcMem.SelectObject(&brush); dcMem.PatBlt(0, 0, rect.Width(), rect.Height(), PATCOPY); dcMem.SelectObject(pOldBrush); brush.DeleteObject(); CDC dcBtn; dcBtn.CreateCompatibleDC(&dcMem); CBitmap *pOldBtnBitmap; if(nStatus == 0) // Normal { pOldBtnBitmap = dcBtn.SelectObject(&m_bmpNormal); ::TransparentBlt(dcMem.GetSafeHdc(), nMargin, nMargin, size.cx, size.cy, dcBtn.GetSafeHdc(), ptSrc.x, 0, size.cx, size.cy, RGB(178,174,173)); } else if(nStatus == 1) // Focus { pOldBtnBitmap = dcBtn.SelectObject(&m_bmpSelect); ::TransparentBlt(dcMem.GetSafeHdc(), nMargin, nMargin, size.cx, size.cy, dcBtn.GetSafeHdc(), ptSrc.x, 0, size.cx, size.cy, RGB(178,174,173)); dcMem.Draw3dRect(rect, RGB(255,255,255), RGB( 98, 98, 98)); } else if(nStatus == 2) // Select { pOldBtnBitmap = dcBtn.SelectObject(&m_bmpSelect); ::TransparentBlt(dcMem.GetSafeHdc(), nMargin+1, nMargin+1, size.cx-1, size.cy-1, dcBtn.GetSafeHdc(), ptSrc.x, 0, size.cx-1, size.cy-1, RGB(178,174,173)); dcMem.Draw3dRect(rect, RGB(128,128,128), RGB(255,255,255)); } else if(nStatus == 3) // Checked { CBitmap bmpPattern; COLORREF aPattern[] = {RGB(192,192,192), RGB(255,255,255), RGB(255,255,255), RGB(192,192,192)}; bmpPattern.CreateBitmap(2, 2, 1, 32, aPattern); brush.CreatePatternBrush(&bmpPattern); pOldBrush = dcMem.SelectObject(&brush); dcMem.PatBlt(nMargin-1, nMargin-1, rect.Width()-(nMargin+1), rect.Height()-(nMargin+1), PATCOPY); dcMem.SelectObject(pOldBrush); brush.DeleteObject(); bmpPattern.DeleteObject(); pOldBtnBitmap = dcBtn.SelectObject(&m_bmpSelect); ::TransparentBlt(dcMem.GetSafeHdc(), 4, 4, size.cx-1, size.cy-1, dcBtn.GetSafeHdc(), ptSrc.x, 0, size.cx-1, size.cy-1, RGB(178,174,173)); dcMem.Draw3dRect(rect, RGB(128,128,128), RGB(255,255,255)); } else if(nStatus == 4) // Disable { pOldBtnBitmap = dcBtn.SelectObject(&m_bmpDisable); ::TransparentBlt(dcMem.GetSafeHdc(), nMargin, nMargin, size.cx, size.cy, dcBtn.GetSafeHdc(), ptSrc.x, 0, size.cx, size.cy, RGB(178,174,173)); } pDC->BitBlt(ptOrg.x-nMargin, ptOrg.y-nMargin, rect.Width(), rect.Height(), &dcMem, 0, 0, SRCCOPY); dcBtn.SelectObject(pOldBtnBitmap); dcBtn.DeleteDC(); dcMem.SelectObject(pOldBitmap); bmpMem.DeleteObject(); dcMem.DeleteDC();}/////////////////////////////////////////////////////////////////////////////void RxToolBarCtrl::SetButtonVisible(int nIndex, BOOL bShow, BOOL bRedraw){ RX_TBBUTTON *pButton = GetButton(nIndex); if(pButton && bShow != GetButtonVisible(nIndex)) { if(bShow) pButton->wStatus[0] |= RXTBS1_VISIBLE; else pButton->wStatus[0] &= ~RXTBS1_VISIBLE; if(bRedraw) RedrawWnd(); }}BOOL RxToolBarCtrl::GetButtonVisible(int nIndex){ RX_TBBUTTON *pButton = GetButton(nIndex); if(pButton != NULL) return (pButton->wStatus[0] & RXTBS1_VISIBLE); return FALSE;}void RxToolBarCtrl::SetButtonEnable(int nIndex, BOOL bEnable){ RX_TBBUTTON *pButton = GetButton(nIndex); if(pButton && bEnable != GetButtonEnable(nIndex)) { if(bEnable) pButton->wStatus[0] &= ~RXTBS1_DISABLE; else pButton->wStatus[0] |= RXTBS1_DISABLE; DrawToolButton(nIndex); }}BOOL RxToolBarCtrl::GetButtonEnable(int nIndex){ RX_TBBUTTON *pButton = GetButton(nIndex); if(pButton != NULL) return !(pButton->wStatus[0] & RXTBS1_DISABLE); return FALSE;}void RxToolBarCtrl::SetButtonCheck(int nIndex, BOOL bCheck){ RX_TBBUTTON *pButton = GetButton(nIndex); if(pButton != NULL && bCheck != GetButtonCheck(nIndex)) { if(bCheck) pButton->wStatus[0] |= RXTBS1_CHECKED; else pButton->wStatus[0] &= ~RXTBS1_CHECKED; DrawToolButton(nIndex); }}BOOL RxToolBarCtrl::GetButtonCheck(int nIndex){ RX_TBBUTTON *pButton = GetButton(nIndex); if(pButton) return (pButton->wStatus[0] & RXTBS1_CHECKED); return FALSE;}RX_TBBUTTON* RxToolBarCtrl::GetButton(int nIndex){ if(nIndex < 0 || nIndex >= m_ArrayButton.GetSize()) return NULL; return (RX_TBBUTTON *)m_ArrayButton[nIndex];}int RxToolBarCtrl::GetButtonCount(){ return m_ArrayButton.GetSize();}void RxToolBarCtrl::RemoveAllButton(){ for(int i = 0; i < m_ArrayButton.GetSize(); i++) delete (RX_TBBUTTON *)m_ArrayButton.GetAt(i); m_ArrayButton.RemoveAll(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -