VC++ CComboBox自绘(颜色下拉列表框)

2023-11-15

使用前,请将控件的Style属性设置为DropdownList(下拉列表),Owner Draw设置为Fixed,Has Strings设置为TRUE,效果图如下:

头文件声明(CSWColorComboBox.h):

#pragma once
#include "afxwin.h"
#include <afxcmn.h>

class CSWColorComboBox : 
	public CComboBox
{
	DECLARE_DYNAMIC(CSWColorComboBox)

#define MAX_COLOR_COUNT 16
#define MAX_COLOR_NAME	16
	struct TColorProperty
	{
		COLORREF m_clrColor;
		char m_szName[MAX_COLOR_NAME];
		TColorProperty()
		{
			memset(this, 0, sizeof(TColorProperty));
		};
		TColorProperty(COLORREF color, LPCTSTR lpszName)
			: TColorProperty()
		{
			m_clrColor = color;								// 颜色值
			strncpy_s(m_szName, lpszName, MAX_COLOR_NAME);	// 颜色名称
		};
	};

public:
	CSWColorComboBox();
	virtual ~CSWColorComboBox();

private:
	static TColorProperty s_clrPropertys[MAX_COLOR_COUNT]; // WEB标准颜色数组

private:
	void CommonConstruct(); // 初始化

protected:
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
	virtual void PreSubclassWindow();

protected:
	DECLARE_MESSAGE_MAP()

public:
	// 获取选择色彩值
	COLORREF GetSelColor();

	// 选择色彩项
	void SelectColor(COLORREF color);
	void SelectColor(LPCTSTR lpszName);

	// 删除色彩项
	void DeleteColor(LPCTSTR lpszName);
	void DeleteColor(COLORREF color);

	// 添加色彩项
	int AddColor(LPCTSTR lpszName, COLORREF color);
};

源码实现(CSWColorComboBox.cpp):

#include "stdafx.h"
#include "CSWColorComboBox.h"


// CSWColorComboBox
IMPLEMENT_DYNAMIC(CSWColorComboBox, CComboBox)
CSWColorComboBox::TColorProperty CSWColorComboBox::s_clrPropertys[MAX_COLOR_COUNT] =
{
	TColorProperty(RGB(0x00, 0x00, 0x00), "黑色(Black)"),
	TColorProperty(RGB(0x80, 0x00, 0x00), "褐红色(Maroon)"),
	TColorProperty(RGB(0x00, 0x80, 0x00), "调和绿(Green)"),
	TColorProperty(RGB(0x80, 0x80, 0x00), "橄榄色(Olive)"),
	TColorProperty(RGB(0x00, 0x00, 0x80), "藏青色(Navy)"),
	TColorProperty(RGB(0x80, 0x00, 0x80), "紫色(Purple)"),
	TColorProperty(RGB(0x00, 0x80, 0x80), "鸭翅绿(Teal)"),
	TColorProperty(RGB(0x80, 0x80, 0x80), "灰色(Gray)"),
	TColorProperty(RGB(0xC0, 0xC0, 0xC0), "银色(Silver)"),
	TColorProperty(RGB(0xFF, 0x00, 0x00), "红色(Red)"),
	TColorProperty(RGB(0x00, 0xFF, 0x00), "绿色(Lime)"),
	TColorProperty(RGB(0xFF, 0xFF, 0x00), "黄色(Yellow)"),
	TColorProperty(RGB(0x00, 0x00, 0xFF), "蓝色(Blue)"),
	TColorProperty(RGB(0xFF, 0x00, 0xFF), "紫红色(Fushcia)"),
	TColorProperty(RGB(0x00, 0xFF, 0xFF), "青色(Aqua)"),
	TColorProperty(RGB(0xFF, 0xFF, 0xFF), "白色(White)"),
};
CSWColorComboBox::CSWColorComboBox()
{
}

CSWColorComboBox::~CSWColorComboBox()
{
}

BEGIN_MESSAGE_MAP(CSWColorComboBox, CComboBox)
	ON_WM_CREATE()
END_MESSAGE_MAP()


void CSWColorComboBox::CommonConstruct(void)
{
	for (int nIndex = 0; nIndex < MAX_COLOR_COUNT; nIndex++)
	{
		int nItem = AddString(s_clrPropertys[nIndex].m_szName);
		if (nItem == CB_ERRSPACE)
			break;
		else
			SetItemData(nItem, s_clrPropertys[nItem].m_clrColor);
	}
}

void CSWColorComboBox::DrawItem(LPDRAWITEMSTRUCT pDIStruct)
{
	CDC dc;
	if (!dc.Attach(pDIStruct->hDC))
		return;

	CString strName;
	CRect rItemRect(pDIStruct->rcItem);
	CRect rcFrame(rItemRect);
	CRect rcText(rcFrame);
	
	// 颜色边框画刷
	CBrush brFrameBrush;
	brFrameBrush.CreateStockObject(BLACK_BRUSH);

	int nFrameWidth = 0;
	int nItem = pDIStruct->itemID;
	int nAction = pDIStruct->itemAction;
	int nState = pDIStruct->itemState;
	COLORREF clrColor = 0;
	COLORREF clrNormal = GetSysColor(COLOR_WINDOW);
	COLORREF clrSelected = GetSysColor(COLOR_HIGHLIGHT);
	COLORREF clrText = GetSysColor(COLOR_WINDOWTEXT);
	
	// 颜色框宽度
	nFrameWidth = 40;
	if (nState & ODS_SELECTED)
	{
		dc.SetTextColor((0x00FFFFFF & ~(clrText)));
		dc.SetBkColor(clrSelected);
		dc.FillSolidRect(&rcFrame, clrSelected);
	}
	else
	{
		dc.SetTextColor(clrText);
		dc.SetBkColor(clrNormal);
		dc.FillSolidRect(&rcFrame, clrNormal);
	}

	if (nState & ODS_FOCUS)
		dc.DrawFocusRect(&rItemRect);

	rcFrame.left += 2;
	rcFrame.right = nFrameWidth;
	rcFrame.top += 2;
	rcText.left += (nFrameWidth + 2);
	rcText.DeflateRect(CSize(2, 2));

	if (nItem != -1)
	{
		GetLBText(nItem, strName);
		if (nState & ODS_DISABLED)
		{
			clrColor = GetSysColor(COLOR_INACTIVECAPTIONTEXT);
			dc.SetTextColor(clrColor);
		}
		else
		{
			clrColor = GetItemData(nItem);
		}

		dc.SetBkMode(TRANSPARENT);
		dc.TextOut(rcText.left, rcText.top, strName);
		if (clrColor != RGB(0,0,1))
		{
			dc.FillSolidRect(&rcFrame, clrColor);
			dc.FrameRect(&rcFrame, &brFrameBrush);
		}
	}

	dc.Detach();
}

COLORREF CSWColorComboBox::GetSelColor()
{
	int nSelIndex = GetCurSel();
	if (nSelIndex == CB_ERR)
		return RGB(0, 0, 0);
	
	return GetItemData(nSelIndex);
}

void CSWColorComboBox::SelectColor(COLORREF color)
{
	int nCount = GetCount();
	for (int nIndex = 0; nIndex < nCount; nIndex++)
	{
		if (color == GetItemData(nIndex))
			SetCurSel(nIndex);
	}
}

void CSWColorComboBox::SelectColor(LPCTSTR lpszName)
{
	int nCount = GetCount();
	CString sColorName;
	for (int nIndex = 0; nIndex < nCount; nIndex++)
	{
		GetLBText(nIndex, sColorName);
		if (!sColorName.CompareNoCase(lpszName))
			SetCurSel(nIndex);
	}
}

void CSWColorComboBox::DeleteColor(LPCTSTR lpszName)
{
	int nCount = GetCount();
	CString strColorName;
	for (int nIndex = 0; nIndex < nCount; nIndex++)
	{
		GetLBText(nIndex, strColorName);
		if (!strColorName.CompareNoCase(lpszName))
		{
			DeleteString(nIndex);
			break;
		}
	}
}

void CSWColorComboBox::DeleteColor(COLORREF color)
{
	int nCount = GetCount();
	for (int nIndex = 0; nIndex < nCount; nIndex++)
	{
		if (color == GetItemData(nIndex))
		{
			DeleteString(nIndex);
			break;
		}
	}
}

int CSWColorComboBox::AddColor(LPCTSTR lpszName, COLORREF color)
{
	int nIndex = InsertString(-1, lpszName);
	if (nIndex != CB_ERR)
		SetItemData(nIndex, color);

	return nIndex;
}

void CSWColorComboBox::PreSubclassWindow()
{
	// TODO: 在此添加专用代码和/或调用基类
	CComboBox::PreSubclassWindow();
	CommonConstruct();
	SetCurSel(0);
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC++ CComboBox自绘(颜色下拉列表框) 的相关文章

随机推荐

  • 如何const定义一个不可变数组

    有个常见的面试题 我们知道 const是es6中新增用于定义常量 但是对于引用类型来说 const 所说的常量 是指 对应的指针或者说地址是常量 那么 如果我们要求 我们定义的数组里面的元素也是不可改变的呢 先来看现象 const a 1
  • webgl--attribute相关使用

    attribute 是存储限定符 是专门用于向外部导出与点位相关的对象的 这类似于es6模板语法中export vec4 是变量类型 vec4是4维矢量对象 a position 是变量名 之后在js中会根据这个变量名导入变量 这个变量名是
  • [CTSC2008]网络管理Network【树状数组+主席树】

    题目链接 题意 有一棵N个点的树 每个点有对应的权值 现在有这样的操作 0 a b 将a点的权值改成为b k a b 询问a到b的链上第k大的权值是几 我们可以用dfs序的树上差分的方式来解决这个问题 可以发现 求u到v的信息 其实就是求u
  • 【c++】角度与弧度转换

    角度转换为弧度 double angle to radian double degree double min double second double flag degree lt 0 1 0 1 0 判断正负 if degree lt
  • matlab与机器学习(二)程序基本操作(含代码解析)

    备注 之间的为注释内容 注释后面的内容 matlab形成自己的编程风格更有利于简洁的编程界面 图像的初步处理可应用于论文撰写上 文章更有说服力 程序调试有利于发现逻辑问题 都是必备的基础知识 I 清空环境变量及命令 clear all cl
  • Python selenium基础用法详解

    活动地址 CSDN21天学习挑战赛 学习的最大理由是想摆脱平庸 早一天就多一份人生的精彩 迟一天就多一天平庸的困扰 学习日记 目录 学习日记 一 Selenium库介绍 1 Selenium简介 2 Selenium的安装 3 安装浏览器驱
  • RabbitMQ系列(十五)RabbitMQ进阶-SprintBoot集成RabbitMQ使用

    RabbitMQ进阶 SprintBoot集成RabbitMQ使用 文章目录 RabbitMQ进阶 SprintBoot集成RabbitMQ使用 1 构建项目 1 1 Spring Init创建项目 1 2 新建项目包 2 初始化Rabbi
  • 【Chrome】分享几个常用的插件,持续集成

    文章目录 一 准备 打开扩展程序 1 1 方式一 1 2 方式二 1 3 打开开发者模式 二 Chrome应用商店在线安装 需要科学上网 三 离线安装 3 1 离线crx下载地址 3 2 crx方式安装 3 3 加载已解压的扩展程序 方式安
  • 计算机组成原理实验——五、单周期CPU设计

    一 实验目的 掌握指令执行过程的5个阶段 掌握每条指令的数据通路选择 掌握译码器和控制器的功能和实现 掌握数据输入输出处理的方法 实现risc v中RV32I指令的单周期CPU 利用实现的risc v CPU实现平方数 二 实验内容 实现r
  • DHorse系列文章之操作手册

    在介绍DHorse的操作之前 我们先来看一下发布一个系统的流程是什么样的 发布系统的流程 我们以一个Springboot系统为例 来说明一下发布流程 1 首先从代码仓库下载代码 比如Gitlab 2 接着是进行打包 比如使用Maven 3
  • 求和2.14

    n int input 输入数字的数量 a list map int input split 输入一个列表 print a S 0 s1 sum a for i in range 0 n s1 a i S a i s1 print S
  • 使用PHPExcel实现数据批量导入到数据库

    此例子只使用execel2003的 xls文档 若使用的是其他版本 可以保存格式为 Execel 97 2003 工作簿 xls 即 xls文件类型即可 功能说明 只能上传Excel2003类型的xls文件 大小不超过5M 可下载例子模板添
  • 配置服务器实现无缝连接

    在进行网络爬虫时 经常会面临目标网站的IP封锁 反爬虫策略等问题 为了解决这些问题 配置代理服务器是一种常见的方法 本文将向您介绍如何配置代理服务器与爬虫实现无缝连接 助您顺利进行数据采集 一 了解代理服务器的作用 代理服务器充当中间人的角
  • vue3.0 vue.config.js 配置实战

    项目常用配置 const path require path const UglifyJsPlugin require uglifyjs webpack plugin function resolve dir return path joi
  • MIUI11系统详细卡刷开发版获取Root超级权限的步骤

    小米的机器不同手机型号一般情况官方论坛都提供两个不同的系统 它们是稳定版和开发版 稳定版没有提供root权限管理 开发版中就提供了root权限 很多情况下我们需要使用的一些功能强大的工具 都需要在root权限下工作 就比如我们公司在使用的营
  • 2、应用入口类 SpringbootApplication&核心注解

    官网 https docs spring io spring boot docs 2 5 8 SNAPSHOT reference htmlsingle getting started installing 核心注解分析 许多 Spring
  • 【Postgresql】触发器某个字段更新时执行,行插入或更新执行

    Postgresql 触发器某个字段更新时执行 行插入或更新执行 1 postgresql触发器 2 触发器的创建及示例 1 字段更新时 触发 2 行插入或更新时 触发 3 触发器的删除 4 触发器的坑 参考 1 postgresql触发器
  • 服务器好玩的项目_推荐!github上四个与100有关的优质项目

    编辑 zero 关注 搜罗最好玩的计算机视觉论文和应用 AI算法与图像处理 微信公众号 获得第一手计算机视觉相关信息 今天要分享四个非常优质的开源项目 一定能够有效的提升你的coding能力 1 Python 100天从新手到大师 2 10
  • 机器学习基础学习-多元线性回归问题(梯度下降法实现)

    1 基本概念 在之前的博客当中描述了怎样模拟出了梯度下降的过程 如果是多维情况 theta其实是一个向量 那么对其求导的损失函数也是向量 梯度就是损失函数对每个方向的theta求偏导 和之前的一维线性回归相比 我们对只是对w这个数字进行求导
  • VC++ CComboBox自绘(颜色下拉列表框)

    使用前 请将控件的Style属性设置为DropdownList 下拉列表 Owner Draw设置为Fixed Has Strings设置为TRUE 效果图如下 头文件声明 CSWColorComboBox h pragma once in