(6条消息) MFC颜色组合框
1、实现效果如下:

2、基于ComboBox控件进行重绘,以便达到如上效果,添加一个派生类如下:
ColorComboBox.h
#pragma once// CColorComboBoxclass CColorComboBox : public CComboBox{DECLARE_DYNAMIC(CColorComboBox)public:CColorComboBox();virtual ~CColorComboBox();protected:DECLARE_MESSAGE_MAP()public:int AddItem(LPCTSTR lpszText, COLORREF clrValue);COLORREF GetCurColor();virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);};
ColorComboBox.cpp
// ColorComboBox.cpp : 实现文件//#include "stdafx.h"#include "ColorComboBox.h"// CColorComboBoxIMPLEMENT_DYNAMIC(CColorComboBox, CComboBox)CColorComboBox::CColorComboBox(){}CColorComboBox::~CColorComboBox(){}BEGIN_MESSAGE_MAP(CColorComboBox, CComboBox)END_MESSAGE_MAP()// CColorComboBox 消息处理程序int CColorComboBox::AddItem(LPCTSTR lpszText, COLORREF clrValue){int nIndex = AddString(lpszText);SetItemData(nIndex, clrValue);return nIndex;}COLORREF CColorComboBox::GetCurColor(){int nIndex = GetCurSel();if (nIndex != -1){return GetItemData(nIndex);}else{return -1;}}void CColorComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){// TODO: 添加您的代码以绘制指定项//验证是否为组合框控件ASSERT(lpDrawItemStruct->CtlType == ODT_COMBOBOX);CDC dc ;dc.Attach(lpDrawItemStruct->hDC);//获取项目区域CRect itemRC (lpDrawItemStruct->rcItem);//定义显示颜色的区域CRect clrRC = itemRC;//定义文本区域CRect textRC = itemRC;//获取系统文本颜色COLORREF clrText = GetSysColor(COLOR_WINDOWTEXT);//选中时的文本颜色COLORREF clrSelected = GetSysColor(COLOR_HIGHLIGHT);//获取窗口背景颜色COLORREF clrNormal = GetSysColor(COLOR_WINDOW);//获取当前项目索引int nIndex = lpDrawItemStruct->itemID;//判断项目状态int nState = lpDrawItemStruct->itemState;if(nState & ODS_SELECTED)//处于选中状态{dc.SetTextColor((0x00FFFFFF & ~(clrText)));//文本颜色取反dc.SetBkColor(clrSelected);//设置文本背景颜色dc.FillSolidRect(&clrRC, clrSelected);//填充项目区域为高亮效果}else{dc.SetTextColor(clrText);//设置正常的文本颜色dc.SetBkColor(clrNormal);//设置正常的文本背景颜色dc.FillSolidRect(&clrRC, clrNormal);}if(nState & ODS_FOCUS)//如果项目获取焦点,绘制焦点区域{dc.DrawFocusRect(&itemRC);}//计算文本区域int nclrWidth =itemRC.Width()/4;textRC.left = nclrWidth + 55;//计算颜色显示区域clrRC.DeflateRect(2, 2);clrRC.right = nclrWidth+50;//绘制颜色文本并且填充颜色区域if (nIndex != -1)//项目不为空{//获取项目颜色COLORREF clrItem = GetItemData(nIndex);dc.SetBkMode(TRANSPARENT);//获取文本CString szText;GetLBText(nIndex, szText);//输出文本dc.DrawText(szText, textRC, DT_LEFT|DT_VCENTER|DT_SINGLELINE);dc.FillSolidRect(&clrRC, clrItem);//输出颜色dc.FrameRect(&clrRC, &CBrush(RGB(0, 0, 0)) );}dc.Detach();}
3、拖放一个Combo Box控件,修改以下三个属性:
(1)Type(类型):Drop List(下拉列表)
(2)Owner Draw:Fixed(固定)
(3)Has Strings:True
4、为该控件绑定一个CColorComboBox型的控制变量:
(1)声明:CColorComboBox m_colorComboBox;(先包含头文件)
(2)绑定:在DoDataExchange函数中(IDC_COMBO1为控件ID):
DDX_Control(pDX, IDC_COMBO1, m_colorComboBox);
(2)在OnInitDialog函数中初始化控件:
m_colorComboBox.AddItem(_T("淡紫"), RGB(202, 111, 255));
m_colorComboBox.AddItem(_T("淡蓝"), RGB(202,224,245));
m_colorComboBox.AddItem(_T("天蓝"), RGB(68,159,245));
m_colorComboBox.AddItem(_T("红色"), RGB(255, 0, 0));
m_colorComboBox.AddItem(_T("蓝色"), RGB(0, 0, 255));
m_colorComboBox.AddItem(_T("绿色"), RGB(0, 255, 0));
m_colorComboBox.AddItem(_T("黄色"), RGB(255, 255, 0));
m_colorComboBox.AddItem(_T("粉色"), RGB(255, 0, 255));
m_colorComboBox.AddItem(_T("棕色"), RGB(255, 128, 64));
m_colorComboBox.SetCurSel(0);
5、OK,现在就能达到开篇的 图片效果了,可以调用GetCurColor函数获取用户选择的颜色;
