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 + -
显示快捷键?