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

2、基于ComboBox控件进行重绘,以便达到如上效果,添加一个派生类如下:
ColorComboBox.h
#pragma once
// CColorComboBox
class 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"
// CColorComboBox
IMPLEMENT_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函数获取用户选择的颜色;