colorcombobox.cpp

来自「深入浅出Visual C++入门进阶与应用实例 随书光盘 作者 何志丹」· C++ 代码 · 共 238 行

CPP
238
字号
// ColorComboBox.cpp : implementation file
//

#include "stdafx.h"
#include "Ex040206.h"
#include "ColorComboBox.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CColorComboBox

CColorComboBox::CColorComboBox()
{
	//小图标尺寸
	iIconX = ::GetSystemMetrics(SM_CXSMICON);
	iIconY = ::GetSystemMetrics(SM_CYSMICON);
}

CColorComboBox::~CColorComboBox()
{
	for(int i = m_crItem.GetSize() - 1 ; i >= 0 ; i-- )
	{
		LPCBITEM lpItem = m_crItem[i];	
		if( NULL == lpItem )
			continue ;
		delete lpItem;
	}
	m_crItem.RemoveAll() ;
}


BEGIN_MESSAGE_MAP(CColorComboBox, CComboBox)
	//{{AFX_MSG_MAP(CColorComboBox)
	ON_WM_MEASUREITEM()
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CColorComboBox message handlers

void CColorComboBox::InitColorCB()
{
	//增加三个最常用的颜色项
	AddAColor("红色",RGB(255,0,0));
	AddAColor("绿色",RGB(0,255,0));
	AddAColor("蓝色",RGB(0,0,255));

	//选中第一项
	if(GetCount() > 0 )
	{
		int index = 0 ;
		LPCBITEM  lpItem = GetItemInfo(index);
		SetCurSel(lpItem->iIndex) ;
		m_crColor = lpItem->crColor ;
	}
}

void CColorComboBox::AddAColor(CString strColorName , COLORREF crColor)
{
	LPCBITEM lpItem = new CBITEM;	
	lpItem->crColor = crColor ;
	lpItem->strColorName = strColorName ;
	lpItem->iIndex = AddString(strColorName);

	m_crItem.Add(lpItem);
}

void CColorComboBox::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
	lpMeasureItemStruct->itemHeight = iIconY + 5 ;
}

void CColorComboBox::OnPaint() 
{
	CPaintDC dc(this); 

	//绘制客户区
	CDC dMemDC;
	dMemDC.CreateCompatibleDC(&dc);
	dMemDC.SetMapMode(dc.GetMapMode());	
	
	//画动作
	CBitmap mNewBmp;
	RECT rc;
	GetClientRect(&rc);
	mNewBmp.CreateCompatibleBitmap(&dc, rc.right - rc.left, rc.bottom - rc.top);
	CBitmap* pOldBmp = dMemDC.SelectObject(&mNewBmp);
	
	//子类可以以friend方式来访问父类的protected成员变量和函数
	CWnd::DefWindowProc(WM_PAINT, (WPARAM)dMemDC.m_hDC, 0);
	
	dc.BitBlt(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, &dMemDC,
		rc.left ,rc.top, SRCCOPY);
	
	//恢复
	dMemDC.SelectObject(pOldBmp);
	pOldBmp->DeleteObject();
	dMemDC.DeleteDC();
	
	GetWindowRect(&rc);
	ScreenToClient(&rc);
	dc.DrawEdge(&rc, BDR_RAISEDINNER , BF_RECT);
}

LPCBITEM CColorComboBox::GetItemInfo(int iIndex)
{
	for(int i = m_crItem.GetSize() - 1 ; i >= 0 ; i-- )
	{
		LPCBITEM lpItem = m_crItem[i];	
		if( NULL == lpItem )
			continue ;
		if( iIndex == lpItem->iIndex )
			return lpItem ;
	}

	return NULL ;
}

BOOL CColorComboBox::OnEraseBkgnd(CDC* pDC) 
{
	ASSERT(pDC->GetSafeHdc());
	return false;
}

void CColorComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
	ASSERT(lpDrawItemStruct->CtlType == ODT_COMBOBOX);
	
	//画笔
	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	ASSERT(pDC->GetSafeHdc());
	
	//绘制区
	RECT rc = lpDrawItemStruct->rcItem;
	RECT rcIcon(rc), rcTxt(rc);
	
	//当前的Item索引号
	LPCBITEM lpItem = GetItemInfo(lpDrawItemStruct->itemID);	
	if(lpItem != NULL)
	{		
		//画颜色Icon
		rcIcon.right = rcIcon.left + iIconX;
		rcIcon.top += (rc.bottom - rc.top - iIconY) / 2;
		rcIcon.bottom = rcIcon.top + iIconY;
		
		pDC->FillSolidRect(rcIcon.left, rcIcon.top, 
			rcIcon.right - rcIcon.left, rcIcon.bottom - rcIcon.top, lpItem->crColor);
		
		pDC->DrawEdge(&rcIcon, BDR_RAISEDINNER, BF_RECT);
		//开始画文字
		int nOldBkMode = pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(RGB(0, 0, 0));
		
		rcTxt.left = rcIcon.right + 5;
		rcTxt.top = rcIcon.top;
		
		pDC->DrawText(lpItem->strColorName, &rcTxt, 
			DT_VCENTER | DT_END_ELLIPSIS | DT_NOCLIP | DT_SINGLELINE);
		
		pDC->SetBkMode(nOldBkMode);
	}
	else
	{
		CBrush brush(RGB(255,255,255)) ;
		pDC->FillRect(&rc,&brush);
	}
}

COLORREF CColorComboBox::GetColor()
{
	return m_crColor;
}

void CColorComboBox::OnSelchange() 
{
	int iIndex = GetCurSel();	
	if(iIndex != CB_ERR && iIndex >= 0)
	{ 	
		//当前的Item索引号
		LPCBITEM lpItem = GetItemInfo(iIndex);
		if( NULL != lpItem )
		{
			m_crColor = lpItem->crColor;	
		}
	}

}

bool CColorComboBox::DeleteAColor(int iIndex)
{
	for(int i = m_crItem.GetSize() - 1 ; i >= 0 ; i-- )
	{
		LPCBITEM lpItem = m_crItem[i];	
		if( NULL == lpItem )
			continue ;
		if(iIndex == lpItem->iIndex )
		{
			delete lpItem ;
			m_crItem.RemoveAt(i);
		
			{//被删除颜色之后的颜色的index都到减一
				for(int j = m_crItem.GetSize() - 1 ; j >= 0 ; j-- )
				{
					LPCBITEM lpItem = m_crItem[j];	
					if( NULL == lpItem )
						continue ;
					if(iIndex <lpItem->iIndex )
						lpItem->iIndex-- ;
				}
				
			}

			DeleteString(iIndex);
			SetCurSel(iIndex);
			//修改当前颜色
			{
				LPCBITEM lpItem = GetItemInfo(iIndex);
				if( NULL != lpItem )
					m_crColor = lpItem->crColor ;
				else
					m_crColor = RGB(255,255,255) ;
			}
			return true ;
		}
	}

	return false ;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?