自绘CTabCtrl控件的实现

自绘CTabCtrl控件的实现_第1张图片

//头文件

#pragma once // OwnerdrawTabCtrl.h : header file ///////////////////////////////////////////////////////////////////////////// // COwnerdrawTabCtrl window class COwnerdrawTabCtrl : public CTabCtrl { // Construction public: COwnerdrawTabCtrl(); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(COwnerdrawTabCtrl) public: virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL); protected: virtual void PreSubclassWindow(); //}}AFX_VIRTUAL // Implementation public: virtual ~COwnerdrawTabCtrl(); // Generated message map functions protected: //{{AFX_MSG(COwnerdrawTabCtrl) //}}AFX_MSG void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); DECLARE_MESSAGE_MAP() };

 

//CPP实现

// OwnerdrawTabCtrl.h : implementation file // #include "stdafx.h" #include "OwnerdrawTabCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // COwnerdrawTabCtrl COwnerdrawTabCtrl::COwnerdrawTabCtrl() { } COwnerdrawTabCtrl::~COwnerdrawTabCtrl() { } BEGIN_MESSAGE_MAP(COwnerdrawTabCtrl, CTabCtrl) //{{AFX_MSG_MAP(COwnerdrawTabCtrl) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // COwnerdrawTabCtrl message handlers void COwnerdrawTabCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your message handler code here and/or call default if(lpDrawItemStruct->CtlType == ODT_TAB) { CRect rect = lpDrawItemStruct->rcItem; INT nTabIndex = lpDrawItemStruct->itemID; if (nTabIndex < 0) return; TCHAR label[64]; TC_ITEM tci; tci.mask = TCIF_TEXT|TCIF_IMAGE; tci.pszText = label; tci.cchTextMax = 63; GetItem(nTabIndex, &tci ); CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if (!pDC) return; int nSavedDC = pDC->SaveDC(); //填充背景色 COLORREF rcBack; if (lpDrawItemStruct->itemState & CDIS_SELECTED ) { rcBack = RGB(255, 0, 0); } else if(lpDrawItemStruct->itemState & (CDIS_DISABLED | CDIS_GRAYED) ) { rcBack = RGB(0, 255, 0); } else { rcBack = GetSysColor(COLOR_BTNFACE); } pDC->FillSolidRect(rect, rcBack); rect.top += ::GetSystemMetrics(SM_CYEDGE); pDC->SetBkMode(TRANSPARENT); //绘制图片 CImageList* pImageList = GetImageList(); if (pImageList && tci.iImage >= 0) { rect.left += pDC->GetTextExtent(_T(" ")).cx; // Margin // Get height of image so we IMAGEINFO info; pImageList->GetImageInfo(tci.iImage, &info); CRect ImageRect(info.rcImage); INT nYpos = rect.top; pImageList->Draw(pDC, tci.iImage, CPoint(rect.left, nYpos), ILD_TRANSPARENT); rect.left += ImageRect.Width(); } //绘制字体 COLORREF txtColor; if (lpDrawItemStruct->itemState & CDIS_SELECTED ) { rect.top -= ::GetSystemMetrics(SM_CYEDGE); txtColor = RGB(0,255,0); } else if(lpDrawItemStruct->itemState & (CDIS_DISABLED | CDIS_GRAYED) ) { txtColor = RGB(128, 128, 128); } else { txtColor = GetSysColor(COLOR_WINDOWTEXT); } pDC->SetTextColor(txtColor); pDC->DrawText(label, rect, DT_SINGLELINE|DT_VCENTER|DT_CENTER); pDC->RestoreDC(nSavedDC); } } void COwnerdrawTabCtrl::PreSubclassWindow() { ModifyStyle(0, TCS_OWNERDRAWFIXED); CTabCtrl::PreSubclassWindow(); } BOOL COwnerdrawTabCtrl::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class dwStyle |= TCS_OWNERDRAWFIXED; return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext); }

 

你可能感兴趣的:(自绘CTabCtrl控件的实现)