一、实现颜色选择框
1.效果展示
![](https://img-blog.csdnimg.cn/img_convert/957ee69b058a405f56c75a7a888445cf.png)
2.主界面实现
2.1DlgColorMain.cpp: 实现文件
#include "pch.h"
#include "MFCColorCombox.h"
#include "DlgColorMain.h"
#include "afxdialogex.h"
// CDlgColorMain 对话框
IMPLEMENT_DYNAMIC(CDlgColorMain, CDialog)
CDlgColorMain::CDlgColorMain(CWnd* pParent /*=nullptr*/)
: CDialog(IDD_DIALOG_COLORMAIN, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CDlgColorMain::~CDlgColorMain()
{
}
void CDlgColorMain::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_COLORCOMBOX, m_ColorCombo);
}
BOOL CDlgColorMain::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
/*DWORD dwExStyle = CBS_OWNERDRAWFIXED | CBS_HASSTRINGS;
m_ColorCombo.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(dwExStyle));*/
m_ColorCombo.Addltem(_T("淡紫"), RGB(202, 111, 255));
m_ColorCombo.Addltem(_T("淡蓝"),RGB(202, 224, 245));
m_ColorCombo.Addltem(_T("天蓝"),RGB(68, 159, 245));
m_ColorCombo.Addltem(_T("红色"),RGB(255, 0, 0));
m_ColorCombo.Addltem(_T("蓝色"),RGB(0, 0, 255));
m_ColorCombo.Addltem(_T("绿色"),RGB(0, 255, 0));
m_ColorCombo.Addltem(_T("黄色"),RGB(255, 255, 0));
m_ColorCombo.Addltem(_T("粉色"),RGB(255, 0, 255));
m_ColorCombo.Addltem(_T("棕色"),RGB(255,128,64));
m_ColorCombo.SetCurSel(0);
return TRUE;
}
BEGIN_MESSAGE_MAP(CDlgColorMain, CDialog)
END_MESSAGE_MAP()
// CDlgColorMain 消息处
2.2DlgColorMain.h: 头文件
#pragma once
#include "CColorCombo.h"
// CDlgColorMain 对话框
class CDlgColorMain : public CDialog
{
DECLARE_DYNAMIC(CDlgColorMain)
public:
CDlgColorMain(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CDlgColorMain();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG_COLORMAIN };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
public:
HICON m_hIcon;
CColorCombo m_ColorCombo;
};
3.CColorCombo实现
3.1CColorCombo.h
#pragma once
#include <afxwin.h>
#pragma once
class CColorCombo :public CComboBox
{
DECLARE_DYNAMIC(CColorCombo)
public:
CColorCombo();
virtual ~CColorCombo();
protected:
DECLARE_MESSAGE_MAP();
public:
int Addltem(LPCTSTR lpszText, COLORREF clrValue);
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
};
3.2CColorCombo.cpp
#include "pch.h"
#include "CColorCombo.h"
IMPLEMENT_DYNAMIC(CColorCombo, CComboBox)
CColorCombo::CColorCombo()
{
}
CColorCombo::~CColorCombo()
{
}
int CColorCombo::Addltem(LPCTSTR lpszText, COLORREF clrValue)
{
int nIndex=AddString(lpszText);
SetItemData(nIndex, clrValue);
return nIndex;
}
void CColorCombo::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//验证是否为组合框控件
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 clrltem = lpDrawItemStruct->itemData;//GetItemData(nIndex);
dc.SetBkMode(TRANSPARENT);
//获取文本
CString sZText;
GetLBText(nIndex, sZText);
//输出文本
dc.DrawText(sZText, textRC, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
dc.FillSolidRect(&clrRC, clrltem);
//输出颜色
dc.FrameRect(&clrRC, &CBrush(RGB(0, 0, 0)));
}
dc.Detach();
return;
}
BEGIN_MESSAGE_MAP(CColorCombo, CComboBox)
END_MESSAGE_MAP()
4.注意事项
4.1下拉框风格,
CBS_OWNERDRAWFIXED | CBS_HASSTRINGS; 这两项必须开不然不会响应draw;
![](https://img-blog.csdnimg.cn/img_convert/3734da8285a3f37a88e5d738ccfbf899.png)
参考:http://www.360doc.com/content/21/0317/13/46626063_967423499.shtml