自绘CTabCtrl控件的实现

 

//头文件

#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.cpp
//

#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) 
{
  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);
}

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值