📄 tabctrl.cpp
字号:
// TabCtrl.cpp : implementation file//#include "stdafx.h"#include "Fusion.h"#include "TabCtrl.h"#include "MemDC.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// RxTabCtrlRxTabCtrl::RxTabCtrl(){ m_nSide = TC_SIDE_TOP; m_crBack = RGB(158,154,153); m_crTabFace = RGB(178,174,173); m_crTabBack = RGB(138,134,133); m_crGuideN = RGB( 0, 0, 0); m_crGuideS = RGB( 98, 98, 98); m_nLeftMargin = 10; m_nTabWingSize = 8; m_nTabWidth = 65; m_nTabHeight = 18; m_bScrollShow = FALSE; m_nScrollPos = 0; m_nCurTab = -1; m_nOldHitTest = -1;}RxTabCtrl::~RxTabCtrl(){ m_ArrayTabText.RemoveAll(); if(m_hWnd) DestroyWindow();}BEGIN_MESSAGE_MAP(RxTabCtrl, CWnd) //{{AFX_MSG_MAP(RxTabCtrl) ON_WM_ERASEBKGND() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_SIZE() ON_WM_LBUTTONDBLCLK() //}}AFX_MSG_MAP ON_MESSAGE_VOID(WM_INITIALUPDATE, OnInitialUpdate) ON_MESSAGE(WM_SETFONT, OnSetFont) ON_MESSAGE(WM_GETFONT, OnGetFont)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// RxTabCtrl message handlersvoid RxTabCtrl::OnInitialUpdate(){}LRESULT RxTabCtrl::OnGetFont(WPARAM wParam, LPARAM lParam){ return (LRESULT)m_font.m_hObject;}LRESULT RxTabCtrl::OnSetFont(WPARAM wParam, LPARAM lParam){ LRESULT lResult = Default(); CFont *pFont = CFont::FromHandle((HFONT)wParam); if(pFont) { LOGFONT lf; pFont->GetLogFont(&lf); m_font.DeleteObject(); m_font.CreateFontIndirect(&lf); } return lResult;}BOOL RxTabCtrl::OnEraseBkgnd (CDC* pDC) { RxMemDC dc(pDC); CRect rcClient; GetClientRect(rcClient); CBrush brush, *pOldBrush; brush.CreateSolidBrush(m_crBack); pOldBrush = dc.SelectObject(&brush); dc.PatBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), PATCOPY); dc.SelectObject(pOldBrush); brush.DeleteObject(); CPen pen, *pOldPen; pen.CreatePen(PS_SOLID, 1, m_crGuideS); pOldPen = dc.SelectObject(&pen); if(m_nSide == TC_SIDE_TOP) { dc.MoveTo(rcClient.left, rcClient.bottom-1); dc.LineTo(rcClient.right, rcClient.bottom-1); } else if(m_nSide == TC_SIDE_BOTTOM) { dc.MoveTo(rcClient.left, rcClient.top); dc.LineTo(rcClient.right, rcClient.top); } else if(m_nSide == TC_SIDE_LEFT) { dc.MoveTo(rcClient.right-1, rcClient.top); dc.LineTo(rcClient.right-1, rcClient.bottom); } else if(m_nSide == TC_SIDE_RIGHT) { dc.MoveTo(rcClient.left, rcClient.top); dc.LineTo(rcClient.left, rcClient.bottom); } dc.SelectObject(pOldPen); pen.DeleteObject(); dc.SetViewportOrg(0, m_nScrollPos); int nTabCount = m_ArrayTabText.GetSize(); if(m_nSide == TC_SIDE_TOP || m_nSide == TC_SIDE_BOTTOM) { for(int i = 0; i < nTabCount; i++) { if(m_nCurTab == i) continue; DrawTabHorz(&dc, i); } if(m_nCurTab > -1) DrawTabHorz(&dc, m_nCurTab); } else { for(int i = 0; i < nTabCount; i++) { if(m_nCurTab == i) continue; DrawTabVert(&dc, i); } if(m_nCurTab > -1) DrawTabVert(&dc, m_nCurTab); } dc.SetViewportOrg(0, 0); if(m_bScrollShow) { if(m_nSide == TC_SIDE_TOP || m_nSide == TC_SIDE_BOTTOM) DrawArrowHorz(&dc, CRect(0,0,0,0), m_nOldHitTest); else if(m_nSide == TC_SIDE_LEFT) DrawArrowVert(&dc, CRect(rcClient.right-m_nTabHeight, rcClient.bottom-m_nTabHeight*2, rcClient.right, rcClient.bottom), m_nOldHitTest); else if(m_nSide == TC_SIDE_RIGHT) DrawArrowVert(&dc, CRect(rcClient.left, rcClient.bottom-m_nTabHeight*2, rcClient.left+m_nTabHeight, rcClient.bottom), m_nOldHitTest); } return TRUE;}void RxTabCtrl::DrawTabHorz (CDC *pDC, int nIndex){ CPen penGuideN, penGuideS, *pOldPen; penGuideN.CreatePen(PS_SOLID, 1, m_crGuideN); penGuideS.CreatePen(PS_SOLID, 1, m_crGuideS); CBrush brFace, brBack, *pOldBrush; brFace.CreateSolidBrush(m_crTabFace); brBack.CreateSolidBrush(m_crTabBack); int nPtTemp[4]; POINT pPoint[4]; GetTabRegion(nIndex, pPoint); pDC->BeginPath(); pDC->MoveTo(pPoint[0].x, pPoint[0].y); pDC->LineTo(pPoint[1].x, pPoint[1].y); pDC->LineTo(pPoint[2].x, pPoint[2].y); pDC->LineTo(pPoint[3].x, pPoint[3].y); pDC->EndPath(); CRect rcTemp; CString strText = m_ArrayTabText.GetAt(nIndex); CFont *pOldFont = pDC->SelectObject(GetFont()); pDC->SetBkMode(TRANSPARENT); if(nIndex == m_nCurTab) { pOldBrush = pDC->SelectObject(&brFace); pDC->FillPath(); if(m_nSide == TC_SIDE_TOP) { nPtTemp[0] = pPoint[0].y-1; nPtTemp[3] = pPoint[3].y-1; } else { nPtTemp[0] = pPoint[0].y; nPtTemp[3] = pPoint[3].y; } if(m_nSide == TC_SIDE_BOTTOM) { nPtTemp[1] = pPoint[1].y-1; nPtTemp[2] = pPoint[2].y-1; } else { nPtTemp[1] = pPoint[1].y; nPtTemp[2] = pPoint[2].y; } pOldPen = pDC->SelectObject(&penGuideS); pDC->MoveTo(pPoint[0].x, nPtTemp[0]); pDC->LineTo(pPoint[1].x, nPtTemp[1]); pDC->LineTo(pPoint[2].x, nPtTemp[2]); pDC->LineTo(pPoint[3].x, nPtTemp[3]); if(m_nSide == TC_SIDE_TOP) rcTemp.SetRect(pPoint[0].x, pPoint[1].y, pPoint[3].x, pPoint[3].y); else rcTemp.SetRect(pPoint[0].x, pPoint[0].y, pPoint[3].x, pPoint[2].y); rcTemp.OffsetRect(0, 1); pDC->SetTextColor(RGB(228,228,228)); pDC->DrawText(strText, rcTemp, DT_SINGLELINE|DT_VCENTER|DT_CENTER); rcTemp.OffsetRect(0, -1); pDC->SetTextColor(RGB( 0, 0, 0)); pDC->DrawText(strText, rcTemp, DT_SINGLELINE|DT_VCENTER|DT_CENTER); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); } else { pOldBrush = pDC->SelectObject(&brBack); pDC->FillPath(); if(m_nSide == TC_SIDE_TOP) { nPtTemp[0] = pPoint[0].y-1; nPtTemp[3] = pPoint[3].y-1; } else { nPtTemp[0] = pPoint[0].y; nPtTemp[3] = pPoint[3].y; } if(m_nSide == TC_SIDE_BOTTOM) { nPtTemp[1] = pPoint[1].y-1; nPtTemp[2] = pPoint[2].y-1; } else { nPtTemp[1] = pPoint[1].y; nPtTemp[2] = pPoint[2].y; } pOldPen = pDC->SelectObject(&penGuideN); pDC->MoveTo(pPoint[0].x, nPtTemp[0]); pDC->LineTo(pPoint[1].x, nPtTemp[1]); pDC->LineTo(pPoint[2].x, nPtTemp[2]); pDC->LineTo(pPoint[3].x, nPtTemp[3]); pDC->SelectObject(&penGuideS); pDC->MoveTo(pPoint[0].x, nPtTemp[0]); pDC->LineTo(pPoint[3].x, nPtTemp[3]); if(m_nSide == TC_SIDE_TOP) rcTemp.SetRect(pPoint[0].x, pPoint[1].y, pPoint[3].x, pPoint[3].y); else rcTemp.SetRect(pPoint[0].x, pPoint[0].y, pPoint[3].x, pPoint[2].y); pDC->SetTextColor(RGB(198,198,198)); pDC->DrawText(strText, rcTemp, DT_SINGLELINE|DT_VCENTER|DT_CENTER); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); } pDC->SelectObject(pOldFont); penGuideN.DeleteObject(); penGuideS.DeleteObject(); brFace.DeleteObject(); brBack.DeleteObject();}void RxTabCtrl::DrawTabVert (CDC *pDC, int nIndex){ CPen penGuideN, penGuideS, *pOldPen; penGuideN.CreatePen(PS_SOLID, 1, m_crGuideN); penGuideS.CreatePen(PS_SOLID, 1, m_crGuideS); CBrush brFace, brBack, *pOldBrush; brFace.CreateSolidBrush(m_crTabFace); brBack.CreateSolidBrush(m_crTabBack); int nPtTemp[4]; POINT pPoint[4]; GetTabRegion(nIndex, pPoint); pDC->BeginPath(); pDC->MoveTo(pPoint[0].x, pPoint[0].y); pDC->LineTo(pPoint[1].x, pPoint[1].y); pDC->LineTo(pPoint[2].x, pPoint[2].y); pDC->LineTo(pPoint[3].x, pPoint[3].y); pDC->EndPath(); CRect rcTemp; CString strText = m_ArrayTabText.GetAt(nIndex); CFont *pOldFont = pDC->SelectObject(GetFont()); pDC->SetBkMode(TRANSPARENT); if(nIndex == m_nCurTab) { pOldBrush = pDC->SelectObject(&brFace); pDC->FillPath(); if(m_nSide == TC_SIDE_LEFT) { nPtTemp[0] = pPoint[0].x-1; nPtTemp[3] = pPoint[3].x-1; } else { nPtTemp[0] = pPoint[0].x; nPtTemp[3] = pPoint[3].x; } if(m_nSide == TC_SIDE_RIGHT) { nPtTemp[1] = pPoint[1].x-1; nPtTemp[2] = pPoint[2].x-1; } else { nPtTemp[1] = pPoint[1].x; nPtTemp[2] = pPoint[2].x; } pOldPen = pDC->SelectObject(&penGuideS); pDC->MoveTo(nPtTemp[0], pPoint[0].y); pDC->LineTo(nPtTemp[1], pPoint[1].y); pDC->LineTo(nPtTemp[2], pPoint[2].y); pDC->LineTo(nPtTemp[3], pPoint[3].y); if(m_nSide == TC_SIDE_LEFT) rcTemp.SetRect(pPoint[1].x, pPoint[0].y, pPoint[0].x, pPoint[3].y); else rcTemp.SetRect(pPoint[0].x, pPoint[0].y, pPoint[1].x, pPoint[3].y); pDC->SetTextColor(RGB(255,255,255)); pDC->DrawText(strText, rcTemp, DT_SINGLELINE|DT_VCENTER|DT_CENTER); rcTemp.OffsetRect(0, -1); pDC->SetTextColor(RGB( 0, 0, 0)); pDC->DrawText(strText, rcTemp, DT_SINGLELINE|DT_VCENTER|DT_CENTER); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); } else { pOldBrush = pDC->SelectObject(&brBack); pDC->FillPath(); if(m_nSide == TC_SIDE_LEFT) { nPtTemp[0] = pPoint[0].x-1; nPtTemp[3] = pPoint[3].x-1; } else { nPtTemp[0] = pPoint[0].x; nPtTemp[3] = pPoint[3].x; } if(m_nSide == TC_SIDE_RIGHT) { nPtTemp[1] = pPoint[1].x-1; nPtTemp[2] = pPoint[2].x-1; } else { nPtTemp[1] = pPoint[1].x; nPtTemp[2] = pPoint[2].x; } pOldPen = pDC->SelectObject(&penGuideN); pDC->MoveTo(nPtTemp[0], pPoint[0].y); pDC->LineTo(nPtTemp[1], pPoint[1].y); pDC->LineTo(nPtTemp[2], pPoint[2].y); pDC->LineTo(nPtTemp[3], pPoint[3].y); pDC->SelectObject(&penGuideS); pDC->MoveTo(nPtTemp[0], pPoint[0].y); pDC->LineTo(nPtTemp[3], pPoint[3].y); if(m_nSide == TC_SIDE_LEFT) rcTemp.SetRect(pPoint[1].x, pPoint[0].y, pPoint[0].x, pPoint[3].y); else rcTemp.SetRect(pPoint[0].x, pPoint[0].y, pPoint[1].x, pPoint[3].y); pDC->SetTextColor(RGB(228,228,228)); pDC->DrawText(strText, rcTemp, DT_SINGLELINE|DT_VCENTER|DT_CENTER); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); } pDC->SelectObject(pOldFont); penGuideN.DeleteObject(); penGuideS.DeleteObject(); brFace.DeleteObject(); brBack.DeleteObject();}void RxTabCtrl::DrawArrowHorz(CDC *pDC, CRect rect, int nCheck){ // fill the background CBrush brush, *pOldBrush; brush.CreateSolidBrush(m_crBack); pOldBrush = pDC->SelectObject(&brush); pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY); pDC->SelectObject(pOldBrush); brush.DeleteObject(); // draw border CRect rcUp, rcDown; rcUp.SetRect (rect.left, rect.top, rect.right, rect.CenterPoint().y); rcDown.SetRect(rect.left, rect.CenterPoint().y, rect.right, rect.bottom); pDC->Draw3dRect(rcUp, m_crGuideN, m_crGuideN); pDC->Draw3dRect(rcDown, m_crGuideN, m_crGuideN); rcUp.DeflateRect(1,1,1,1); rcDown.DeflateRect(1,1,1,1); if(nCheck == TC_SCROLL_UP) { rcUp.OffsetRect(1,1); pDC->Draw3dRect(rcDown, RGB(255,255,255), RGB( 68, 68, 68)); } else if(nCheck == TC_SCROLL_DOWN) { rcDown.OffsetRect(1,1); pDC->Draw3dRect(rcUp, RGB(255,255,255), RGB( 68, 68, 68)); } else { pDC->Draw3dRect(rcDown, RGB(255,255,255), RGB( 68, 68, 68)); pDC->Draw3dRect(rcUp, RGB(255,255,255), RGB( 68, 68, 68)); } // draw left arrow int nArrowHeight = rcUp.Width() / 3; POINT pPoint[3]; pPoint[0].x = rcUp.left+nArrowHeight*2; pPoint[0].y = rcUp.CenterPoint().y-nArrowHeight; pPoint[1].x = rcUp.left+nArrowHeight*2; pPoint[1].y = rcUp.CenterPoint().y-nArrowHeight; pPoint[2].x = rcUp.left+nArrowHeight; pPoint[2].y = rcUp.CenterPoint().y; DrawArrow(pDC, pPoint, RGB(255, 0, 0)); // draw right arrow pPoint[0].x = rcUp.left+nArrowHeight; pPoint[0].y = rcUp.CenterPoint().y-nArrowHeight; pPoint[1].x = rcUp.left+nArrowHeight; pPoint[1].y = rcUp.CenterPoint().y-nArrowHeight; pPoint[2].x = rcUp.left+nArrowHeight*2; pPoint[2].y = rcUp.CenterPoint().y; DrawArrow(pDC, pPoint, RGB(255, 0, 0));}void RxTabCtrl::DrawArrowVert(CDC *pDC, CRect rect, int nCheck){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -