📄 buttons.cpp
字号:
pDC->FillSolidRect(rect, m_crBkgnd); if (state & ODS_FOCUS) pDC->DrawFocusRect(rect); // Set Left margin. CRect rcTemp = rect; rcTemp.left += 2; // Draw Radio DrawRadio(pDC, rcTemp, state); // Draw Text DrawButtonText(pDC, rcTemp); // Clean up. pDC->RestoreDC(nSaveDC);}void RxRadioButton::DrawRadio(CDC *pDC, CRect rect, UINT nState){ CRect rcRadio; rcRadio.left = rect.left; rcRadio.top = rect.Height() / 2 - 6; rcRadio.right = rect.left + 12; rcRadio.bottom = rect.Height() / 2 + 6; // Create brush. CBrush brRadioFace, brRadioPoint, *pOldBrush; brRadioFace.CreateSolidBrush(m_crRadioFace); brRadioPoint.CreateSolidBrush(m_crRadioPoint); // Create pen. CPen penRadioEdge, penRadio1, penRadio2, penRadio3, penRadio4, penRadio5, *pOldPen; penRadioEdge.CreatePen(PS_SOLID, 1, m_crRadioEdge); penRadio1.CreatePen(PS_SOLID, 1, m_crRadio1); penRadio2.CreatePen(PS_SOLID, 1, m_crRadio2); penRadio3.CreatePen(PS_SOLID, 1, m_crRadio3); penRadio4.CreatePen(PS_SOLID, 1, m_crRadio4); penRadio5.CreatePen(PS_SOLID, 1, m_crRadio5); // 盔葛剧狼 抛滴府 pOldBrush = pDC->SelectObject(&brRadioFace); pOldPen = pDC->SelectObject(&penRadioEdge); pDC->RoundRect(rcRadio, CPoint(10, 10)); if (nState & ODS_SELECTED) goto end; if (GetCheck()) // 眉农 登绢 乐阑 版快 { pDC->SelectObject(&penRadioEdge); pDC->SelectObject(&brRadioPoint); rcRadio.DeflateRect(3,3,3,3); pDC->Ellipse(rcRadio); } else { // 促捞酒阁靛屈 抛滴府 pDC->SelectObject(&penRadio1); pDC->MoveTo(rcRadio.left + 4, rcRadio.top); pDC->LineTo(rcRadio.left - 1, rcRadio.top + 5); pDC->MoveTo(rcRadio.left + 7, rcRadio.top); pDC->LineTo(rcRadio.left + 12, rcRadio.top + 5); pDC->MoveTo(rcRadio.left + 4, rcRadio.top + 11); pDC->LineTo(rcRadio.left - 1, rcRadio.top + 6); pDC->MoveTo(rcRadio.left + 7, rcRadio.top + 11); pDC->LineTo(rcRadio.left + 12, rcRadio.top + 6); pDC->SelectObject(&penRadio2); pDC->MoveTo(rcRadio.left + 4, rcRadio.top + 10); pDC->LineTo(rcRadio.left + 7, rcRadio.top + 10); pDC->LineTo(rcRadio.left + 10, rcRadio.top + 7); pDC->LineTo(rcRadio.left + 10, rcRadio.top + 3); pDC->SelectObject(&penRadio3); pDC->MoveTo(rcRadio.left + 3, rcRadio.top + 9); pDC->LineTo(rcRadio.left + 6, rcRadio.top + 9); pDC->LineTo(rcRadio.left + 9, rcRadio.top + 6); pDC->LineTo(rcRadio.left + 9, rcRadio.top + 2); pDC->MoveTo(rcRadio.left + 7, rcRadio.top + 9); pDC->LineTo(rcRadio.left + 10, rcRadio.top + 6); pDC->SelectObject(&penRadio4); pDC->MoveTo(rcRadio.left + 2, rcRadio.top + 8); pDC->LineTo(rcRadio.left + 6, rcRadio.top + 8); pDC->LineTo(rcRadio.left + 8, rcRadio.top + 6); pDC->LineTo(rcRadio.left + 8, rcRadio.top + 1); pDC->SelectObject(&penRadio5); pDC->MoveTo(rcRadio.left + 2, rcRadio.top + 4); pDC->LineTo(rcRadio.left + 5, rcRadio.top + 1); pDC->MoveTo(rcRadio.left + 2, rcRadio.top + 5); pDC->LineTo(rcRadio.left + 6, rcRadio.top + 1); pDC->MoveTo(rcRadio.left + 2, rcRadio.top + 6); pDC->LineTo(rcRadio.left + 7, rcRadio.top + 1); pDC->MoveTo(rcRadio.left + 2, rcRadio.top + 7); pDC->LineTo(rcRadio.left + 8, rcRadio.top + 1); pDC->SetPixel(rcRadio.left + 3, rcRadio.top + 3, m_crRadioFace); pDC->SetPixel(rcRadio.left + 3, rcRadio.top + 6, m_crRadioFace); pDC->SetPixel(rcRadio.left + 6, rcRadio.top + 3, m_crRadioFace); }end: brRadioFace.DeleteObject(); brRadioPoint.DeleteObject(); penRadioEdge.DeleteObject(); penRadio1.DeleteObject(); penRadio2.DeleteObject(); penRadio3.DeleteObject(); penRadio4.DeleteObject(); penRadio5.DeleteObject(); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen);}void RxRadioButton::DrawButtonText(CDC *pDC, CRect rect){ // Apply CWnd font CFont *pFont = GetFont(); CFont *pOldFont = (CFont *)pDC->SelectObject(pFont); // Draw Window Text CString strWindow; GetWindowText(strWindow); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(IsWindowEnabled() ? m_crText : RGB(132,132,132)); // for Radio Margin rect.left += 20; UINT nStyle = GetStyle(); if(nStyle & BS_MULTILINE) { rect.top += 3; rect.bottom +=3; pDC->DrawText(strWindow, rect, DT_VCENTER); } else pDC->DrawText(strWindow, rect, DT_VCENTER|DT_SINGLELINE); // Restore the original font. pDC->SelectObject(pOldFont);}void RxRadioButton::RecalcLayout(){ CClientDC dc(this); CString strText; GetWindowText(strText); // Apply CWnd font CFont *pFont = GetFont(); CFont *pOldFont = (CFont *)dc.SelectObject(pFont); int btnSizeX = dc.GetTextExtent(strText).cx + 26; int btnSizeY = dc.GetTextExtent(strText).cy + 4; SetWindowPos(NULL, -1, -1, btnSizeX, btnSizeY, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE); dc.SelectObject(pOldFont);}/////////////////////////////////////////////////////////////////////////////// RxCheckButton Class/////////////////////////////////////////////////////////////////////////////RxCheckButton::RxCheckButton(){ m_crBkgnd = RGB(204,220,223); m_crText = RGB( 0, 0, 0); m_crBoxEdge = RGB( 0, 0, 0); m_crBoxFace = RGB(222,233,235); m_crBoxLeftTop = RGB(120,120,120); m_crBoxRightBottom = RGB(240,240,240); m_crCheck1 = RGB( 0, 0, 0); m_crCheck2 = RGB(150,150,150); m_crCheck3 = RGB(255,255,255);}RxCheckButton::~RxCheckButton(){}BEGIN_MESSAGE_MAP(RxCheckButton, RxButton) //{{AFX_MSG_MAP(RxCheckButton) ON_WM_ERASEBKGND() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// RxCheckButton message handlersBOOL RxCheckButton::OnEraseBkgnd(CDC* pDC) { return TRUE;}void RxCheckButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // 滚瓢狼 阿辆 惑怕沥焊甫 掘绢柯促. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rect = lpDrawItemStruct->rcItem; UINT state = lpDrawItemStruct->itemState; int nSaveDC = pDC->SaveDC(); pDC->FillSolidRect(rect, m_crBkgnd); if (state & ODS_FOCUS) pDC->DrawFocusRect(rect); // Set Left margin. CRect rcTemp = rect; rcTemp.left += 2; // Draw CheckBox DrawCheckBox(pDC, rcTemp, state); // Draw Text DrawButtonText(pDC, rcTemp); pDC->RestoreDC(nSaveDC);}/////////////////////////////////////////////////////////////////////////////// User Defined Functionsvoid RxCheckButton::DrawCheckBox(CDC *pDC, CRect rect, UINT nState){ CRect rcCheckBox; rcCheckBox.left = rect.left; rcCheckBox.top = rect.Height() / 2 - 6; rcCheckBox.right = rect.left + 12; rcCheckBox.bottom = rect.Height() / 2 + 6; if(IsWindowEnabled()) { // Fill the Box pDC->FillSolidRect(rcCheckBox, m_crBoxFace); // Draw the Box Edge pDC->Draw3dRect(rcCheckBox, m_crBoxEdge, m_crBoxEdge); rcCheckBox.DeflateRect(1, 1); pDC->Draw3dRect(rcCheckBox, m_crBoxLeftTop, m_crBoxRightBottom); rcCheckBox.InflateRect(1, 1); } else { // Fill the Box pDC->FillSolidRect(rcCheckBox, RGB(212,212,212)); // Draw the Box Edge pDC->Draw3dRect(rcCheckBox, RGB( 98, 98, 98), RGB( 98, 98, 98)); } if (GetCheck()) { CPen Pen1, Pen2, Pen3, *pOldPen; Pen1.CreatePen(PS_SOLID, 1, IsWindowEnabled() ? m_crCheck1 : RGB( 98, 98, 98)); Pen2.CreatePen(PS_SOLID, 1, m_crCheck2); Pen3.CreatePen(PS_SOLID, 1, m_crCheck3); pOldPen = pDC->SelectObject(&Pen1); pDC->MoveTo(rcCheckBox.left+ 3, rcCheckBox.top+ 5); pDC->LineTo(rcCheckBox.left+ 5, rcCheckBox.top+ 7); pDC->LineTo(rcCheckBox.left+11, rcCheckBox.top+ 1); pDC->MoveTo(rcCheckBox.left+ 2, rcCheckBox.top+ 5); pDC->LineTo(rcCheckBox.left+ 5, rcCheckBox.top+ 8); pDC->LineTo(rcCheckBox.left+11, rcCheckBox.top+ 0); pDC->SelectObject(&Pen2); pDC->MoveTo(rcCheckBox.left+ 5, rcCheckBox.top+ 9); pDC->LineTo(rcCheckBox.left+11, rcCheckBox.top+ 1); pDC->SelectObject(&Pen3); pDC->MoveTo(rcCheckBox.left+ 3, rcCheckBox.top+ 7); pDC->LineTo(rcCheckBox.left+ 4, rcCheckBox.top+ 9); pDC->MoveTo(rcCheckBox.left+ 6, rcCheckBox.top+ 9); pDC->LineTo(rcCheckBox.left+11, rcCheckBox.top+ 1); pDC->SelectObject(pOldPen); Pen1.DeleteObject(); Pen2.DeleteObject(); Pen3.DeleteObject(); }}void RxCheckButton::DrawButtonText(CDC *pDC, CRect rect){ // Apply CWnd font CFont *pFont = GetFont(); CFont *pOldFont = (CFont *)pDC->SelectObject(pFont); // Draw Window Text CString strWindow; GetWindowText(strWindow); pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(IsWindowEnabled() ? m_crText : RGB(132,132,132)); // for CheckBox Margin rect.left += 20; UINT nStyle = GetStyle(); if(nStyle & BS_MULTILINE) { rect.top += 3; rect.bottom +=3; pDC->DrawText(strWindow, rect, DT_VCENTER); } else pDC->DrawText(strWindow, rect, DT_VCENTER|DT_SINGLELINE); // Restore the original font. pDC->SelectObject(pOldFont);}void RxCheckButton::RecalcLayout(){ CClientDC dc(this); CString strText; GetWindowText(strText); // Apply CWnd font CFont *pFont = GetFont(); CFont *pOldFont = (CFont *)dc.SelectObject(pFont); int btnSizeX = dc.GetTextExtent(strText).cx + 26; int btnSizeY = dc.GetTextExtent(strText).cy + 4; SetWindowPos(NULL, -1, -1, btnSizeX, btnSizeY, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE); dc.SelectObject(pOldFont);}/////////////////////////////////////////////////////////////////////////////// RxBitmapButton Class/////////////////////////////////////////////////////////////////////////////RxBitmapButton::RxBitmapButton(){ m_nLoadBitmap = BM_NORMAL;}RxBitmapButton::~RxBitmapButton(){}BEGIN_MESSAGE_MAP(RxBitmapButton, RxButton) //{{AFX_MSG_MAP(RxBitmapButton) ON_WM_ERASEBKGND() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// RxBitmapButton message handlersBOOL RxBitmapButton::OnEraseBkgnd(CDC* pDC) { return TRUE;}void RxBitmapButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // 滚瓢狼 阿辆 惑怕沥焊甫 掘绢柯促. CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rect = lpDrawItemStruct->rcItem; UINT state = lpDrawItemStruct->itemState; // Create a mem DC for drawing CDC dcMem; CBitmap bmpMem; dcMem.CreateCompatibleDC(pDC); bmpMem.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); CBitmap *pOldBmp = dcMem.SelectObject(&m_bmpResource); int nSaveDC = dcMem.SaveDC(); int nPosIndex = 0; // Get bitmap index switch(m_nButtonStyle) { // 阿 滚瓢狼 屈怕肺 累悼窍绰 巴贸烦 厚飘甘阑 免仿茄促. case BS_PUSHBUTTON : if ((state & ODS_SELECTED) && (m_nLoadBitmap & BM_SELECT)) nPosIndex = 1; else if ((state & ODS_FOCUS) && (m_nLoadBitmap & BM_FOCUS)) nPosIndex = 2; else if ((state & ODS_DISABLED) && (m_nLoadBitmap & BM_DISABLED)) nPosIndex = 3; else nPosIndex = 0; break; case BS_RADIOBUTTON : if ((state & ODS_DISABLED) && (m_nLoadBitmap & BM_DISABLED)) nPosIndex = 3; else if ((state & ODS_FOCUS || state & ODS_SELECTED) && (m_nLoadBitmap & BM_FOCUS)) { if (GetCheck() && (m_nLoadBitmap & BM_SELECT)) nPosIndex = 1; else nPosIndex = 2; } else { if(GetCheck() && (m_nLoadBitmap & BM_SELECT)) nPosIndex = 1; else nPosIndex = 0; } break; case BS_CHECKBOX : if ((state & ODS_DISABLED) && (m_nLoadBitmap & BM_DISABLED)) nPosIndex = 3; else if ((state & ODS_FOCUS) && (m_nLoadBitmap & BM_FOCUS)) { if ((GetCheck() || state & ODS_SELECTED) && (m_nLoadBitmap & BM_SELECT)) nPosIndex = 1; else nPosIndex = 2; } else { if ((GetCheck() || state & ODS_SELECTED) && (m_nLoadBitmap & BM_SELECT)) nPosIndex = 1; else nPosIndex = 0; } break; } pDC->BitBlt(rect.left, rect.top, m_szBitmap.cx, m_szBitmap.cy, &dcMem, m_szBitmap.cx * nPosIndex, 0, SRCCOPY); // Clean up. dcMem.SelectObject(pOldBmp); dcMem.RestoreDC(nSaveDC); dcMem.DeleteDC(); bmpMem.DeleteObject();}// 厚飘甘阑 肺靛秦 初绰促.BOOL RxBitmapButton::LoadBitmaps(UINT nIDBmpResource, CSize szBitmap, UINT nLoadBitmap){ // delete old bitmap (if present) m_bmpResource.DeleteObject(); if(!m_bmpResource.LoadBitmap(nIDBmpResource)) // Load all bitmap { TRACE0("Failed to load bitmap for resource image.\n"); return FALSE; } m_szBitmap = szBitmap; // size for each bitmap, must have same size m_nLoadBitmap = nLoadBitmap; // Size to Content VERIFY(SetWindowPos(NULL, -1, -1, szBitmap.cx, szBitmap.cy, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE)); return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -