VC颜色选择组合框

本文代码执行效果:


大家对Word一定非常熟悉吧,它里面的东东可真不少,不管是活泼可爱的“大眼夹”,还是各种平面造型的Windows控件我都很喜欢。那么这次就让我们来做个非常常用的控件:“颜色组合框”。如果你现在正在做关于字处理类的软件时我想这个东东一定对你有用,哈哈!还是废话少说,让我们转入正题!

一、基本过程

(1) 首先,打开VC++新建一个基于对话框的空白工程。这个我就不用多做介绍了吧。

(2) 往界面上拉一个ComboBox控件吧,然后不要忘了声明相应的类对象,我们以后的操作可都全靠它了。

(3) 新建一个类,该类是从CComboBox类继承下来的,类名为:CBSColorComboBox。

接下来就让我们先来了解一下画控件的基本原理和过程,也许这个才是本文的原意。大家都知道Windows中所有可视的东西都是画出来的,那么这个画画的内部过程又是怎样的呢?一般画Windows控件的过程分为三大部分:

第一:在WM_MEASUREITEM消息影射函数中设置当前要画的Item的大小尺寸;

第二:在WM_DRAWITEM消息影射函数中根据Item的大小尺寸来画该Item(图标/位图/字符串等);

第三:在WM_PAINT消息映射函数中不断的绘制当前的控件内容。下面我们针对CBSColorComboBox类的这几个过程来做个简单的介绍。

(1) 在WM_MEASUREITEM消息影射函数中设定Item的大小尺寸。在这里我们只需要设置Item的高度即可。这里的高度我们设置为2倍的系统小ICON的高度(用::GetSystemMetrics(SM_CXSMICON)取得)。

(2) 在WM_DRAWITEM消息影射函数中根据Item的大小尺寸来画该Item的各种信息。你可以在Item的矩形区域内画各种各样的信息,例如:图标/位图/字符串等等。那么有人会疑问:“我们用什么来画?我们在哪里画?又如何来画呢?”。答案其实都在这个LPDRAWITEMSTRUCT结构中。hDC成员为设备上下文环境(HDC),获得了该设备句柄也就意味着我们拥有了画任何位图/图标/文本的能力;那么接下来的问题就是:我们在哪里来画呢?答案也很简单:获得LPDRAWITEMSTRUCT结构中Item的矩形区域(rcItem),那么这就是你施展才华的空间了,要充分利用它哦!最后一步就是如何来画的问题了,说白了就是如何分配每个元素的空间,如何在它们各自的空间上画出你想要的东西。按照常规一般分别计算出ICON所占的矩形区域/文本所占的矩形区域/位图的矩形区域,如果你还有其他元素那么也应该计算出该元素所占的矩形区域/位图所占的矩形区域。接下来我想一切都很简单了,不外乎CDC类的几个常用函数:画图标用DrawIcon;画位图用:BitBlt;画文字用:DrawText等等。如果你觉得视觉上还不够COOL,你还可以来设置各个Item的文本颜色,背景颜色,以及图标的突起和凹陷的视觉效果。

二、需要注意的问题:

第一:程序为了消除不断绘制所带来的闪烁现象,特意在WM_ERASEBKGND消息中中做了特殊处理;在WM_PAINT消息中直接把组合框的客户区当成一幅位图来不断更新,而不是对ICON区域和文本区域分别重绘。

第二:每当用户改变了组合框的当前内容后,你在画新的Item之前一定要记得清除前次组合框内的内容。

第三:如果您想选择更多的颜色,那么只要选择组合框中的最后一个Item(More Colors)即可,这个Item是为用户自定义颜色而专门设置的。

怎么样,做自己的控件Easy吧!其实上面的过程适用于菜单Menu/ListBox/Button/ComboBox等大多数东东的自画过程。如果你感觉听起来还是有点不知所云,那么打开工程看看吧,相信你会一目了然!如果发现了什么问题请来信:lixiaofei@geasp.com或mailto:Devia@163.com

时间: 2024-09-17 04:33:31

VC颜色选择组合框的相关文章

VC++:选择组合框中的条件实现对access数据库文件的自动查询并显示到编辑框中

问题描述 VC++:选择组合框中的条件实现对access数据库文件的自动查询并显示到编辑框中 请教下大家:如标题 当鼠标选择组合框下拉列表中的条件时,自动根据下拉框条件查询ACCES数据库中的数据,并将查询的结果显示到编辑框中去,谢谢! 解决方案 http://blog.csdn.net/wenluderen/article/details/39029649 解决方案二: http://blog.csdn.net/yunqi415/article/details/6963720

VC++通过选择组合框条件自动查询数据库,并将查询结果显示到编辑框

问题描述 VC++通过选择组合框条件自动查询数据库,并将查询结果显示到编辑框 问题如标题,目前编写代码如下,但选择组合框条件后没反应 代码如下,诚盼大家指教,我是编程爱好者,为自己做需,谢谢!: CShiYinShaSet rs; UpdateData(); CString strSQL; //ShiYinSha:数据库中表名: //PiCi:表中列名: //Si_Pi:组合框ID变量,CString Si_Pi strSQL.Format("select * from ShiYinSha wh

vc++6.0-VC++6.0 MFC基于对话框组合框中内容的判断

问题描述 VC++6.0 MFC基于对话框组合框中内容的判断 是这样的,我在模态对话框编辑框中输入一个值,点击确定添加到组合框项中,我想通过点击选择刚输入的项来实现某种功能.(*因为每次输入的值不同,这项的内容不同就不好判断了*)请高手指点应该怎么做?敬请详解 解决方案 int iPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //当前选中的行.

access 如何解决组合框无法满足大量数据的选择问题?

access|解决|数据|问题 如何解决组合框无法满足大量数据的选择问题?     问题: Access里面有组合框,可以很快地从多行记录中选择所需要的数据.但是如果记录超过1000-2000呢?选择就非常不方便了.我该怎么办?  回答: 其实很多数据都可以分类(分层)来选择,而且我们可以预先筛选数据.以下这个示例就是用重复打开同一个窗体类来完成多层次数据的选择.当然,还包括预先筛选数据功能. 在阅读本文前请先参考:<新手来看:如何设计表结构便于treeview显示?>http://acces

Access 新手来看:如何在表中达到用组合框选择备选项目的效果

access|项目 Access 新手来看:如何在表中达到用组合框选择备选项目的效果  简述:如何在表中达到用组合框选择备选项目的效果    问题: 这个范例就是ACCESS2002本身带有的ADDREESS表,其中,有个家庭成员的表,里面输入的时候,我发现输入角色这个字段时候,就可以点开一个下拉窗口,可以在下拉窗口里面选择,我搞不明白,我学着这个例子.建立了一个库.包括两个表.我现在把他们之间的关系建立起来了,其中一个表格里面的数据读取另外一个表格的记录,样子如下表1:id,gender,re

access解决组合框无法满足大量数据的选择问题

问题: Access里面有组合框,可以很快地从多行记录中选择所需要的数据.但是如果记录超过1000-2000呢?选择就非常不方便了.我该怎么办? 回答: 其实很多数据都可以分类(分层)来选择,而且我们可以预先筛选数据. 以下这个示例就是用重复打开同一个窗体类来完成多层次数据的选择. 当然,还包括预先筛选数据功能. 在阅读本文前请先参考: <新手来看:如何设计表结构便于treeview显示?> http://access911.net/index.asp?board=4&recordid

VC/MFC 工具栏上动态添加组合框等控件的方法

引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发环境所创建的应用程序框架中的工具条只是一个简单的按钮的集合,在功能上也仅仅是起到了菜单快捷方式的作用,而没有做到象VC.Word等软件的工具条那样,提供多种不同类型的标准控件如组合框.编辑框等.尤其是组合框在添加到工具条上后,可将原本需要在弹出对话框中完成的交互操作在工具条上就可以进行,从而在很大程

vc++6.0mfc-vc++6.0如何实现点击组合框列表里的项响应相应消息?

问题描述 vc++6.0如何实现点击组合框列表里的项响应相应消息? 我想实现,在模态对话框编辑框里输入几个值,然后点击确定按钮将其添加到组合框列表中,当点击组合框列表里刚添加的项时响应相应消息(如:我在模态对话框四个编辑框中输入a.b.c.d,然后点击确定按钮,将a.b.c.d添加到组合框列表里,当点击组合框列表a时,提示你点击了a,当点击b时,提示你点击b--c,d,f,g也同上).我只是个新手,望大神们详解! 解决方案 CString str; int i = m_list->GetCurS

vc++-关于MFC中组合框的应用问题

问题描述 关于MFC中组合框的应用问题 我使用组合框添加了1~5个数字,想代表实际应用中的5个运动轴,那么应该如何编写这个组合框的函数,可以使当在组合框中选中"1"时,可以是程序关联到我的运动轴一. 解决方案 组合问题及应用 解决方案二: 轴号: int num=2; 组合框关联控件变量:m_ComboBox 在对话框初始化函数加入: CString str; for(int i=0; i<5; i++) { str.Format("%d",i+1); m_C