MFC修改下拉列表文字颜色

一、实现颜色选择框

1.效果展示

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;

参考:http://www.360doc.com/content/21/0317/13/46626063_967423499.shtml

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值