Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2095919
  • 博文数量: 909
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 12260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-06 20:50
文章分类

全部博文(909)

文章存档

2008年(909)

我的朋友

分类:

2008-05-06 21:33:37

一起学习
颜色选择组合框
作者:李晓飞

下载本文示例代码

本文代码执行效果:


大家对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

下载本文示例代码


颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框颜色选择组合框
阅读(291) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~