Yesky 张伟
组合框是组成Windows窗口常见的控件之一,Windows程序员在应用软件开发中经常要用到组合框。但随微软开发工具语言(如C/C++/C#/VB/VF)提供的标准组合框都是同一面孔:组合框中每一项都是字符串,看起来有点灰头土脸,不那么赏心悦目(如图1)。 图1 今天我们就来给组合框美容一下,使组合框中每一项都带有个性,组合框中每一项即可以让字符串格式变化多样,也可以使每一项都带有各种图形,同样也可以让每一项都带有图像等等。 例1:本例中我们在一个表单上创建三个组合框,从上到下名字分别为comboBox1~comboBox3,通过编程分别让它们的组合框条目字符串格式发生变化、每项前都有图形、每项前都有图像。
第一步:建立项目 |
第四步:编程 说明:当我们通过组合框的Add方法向组合框添加item时,都会发生组合框的DrawItem事件处理函数来画组合框item,因此如果我们想创建个性化的组合框只有在DrawItem事件处理函数中做文章了。在编程之前我们需要了解如下的基础知识。 (1)在组合框条目中显示文本时都是利用grphics类的DrawString函数,此函数有多个变体,现把此函数各种形式简介如下: ①public void DrawString(string, Font, Brush, PointF); 在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串。 ②public void DrawString(string, Font, Brush, RectangleF); 在指定矩形并且用指定的 Brush 和 Font 对象绘制指定的文本字符串。 ③public void DrawString(string, Font, Brush, PointF, StringFormat); 使用指定 StringFormat 对象的格式化属性,用指定的 Brush 和 Font 对象在指定的位置绘制指定的文本字符串。 ④public void DrawString(string, Font, Brush, RectangleF, StringFormat); 使用指定 StringFormat 对象的格式化属性,用指定的 Brush 和 Font 对象在指定的矩形绘制指定的文本字符串。 ⑤public void DrawString(string, Font, Brush, float, float); 在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串。 ⑥public void DrawString(string, Font, Brush, float, float, StringFormat); 使用指定 StringFormat 对象的格式化属性,用指定的 Brush 和 Font 对象在指定的位置绘制指定的文本字符串。 在本例中我们注意使用第④种。 (2)在组合框画矩形时大都使用graphics类的FillRectangle()函数,本例中我们所用的格式如下: FillRectangle(brush_name,rectange); (3)comboBox1~comboBox3的DrawItem事件处理程序接收一个 DrawItemEventArgs 类型的参数,它包含与此事件相关的数据。下列 DrawItemEventArgs 属性提供特定于此事件的信息。 BackColor:获取所绘制的项的背景色。 Bounds:获取表示所绘制项的边界的矩形。 Font:获取分配给所绘制项的字符串格式。 ForeColor: 获取所绘制项的前景色。 Graphics:获取要在其上绘制项的图形表面。 Index:获取所绘制项的索引值。 State:获取所绘制项的状态。 有了以上的"基础知识"我们开始编程了。因为我们想在comboBox1改变字符串格式,在comboBox2中改变每项前的图形颜色颜色,所以我们需要创建多种字符串格式、多种画刷。因此我们必须建立两个ArrayList类型的数组来保存我们创建的字符串格式与画刷,于是在类的前面添加如下两句:
(4)我们什么时候创建字符串格式组、画刷组比较合适呢?当然要在画组合框之前了,不然的话如何用?因此只有在Form1_Load事件中前部创建字符串格式、画刷了。Form1_Load代码如下:
|
我们看看comboBox1的DrawItem事件处理函数,其代码如下:
再来看看comboBox2的DrawItem事件处理函数,其代码如下:
最后我们看看comboBox3的DrawItem事件处理函数,其源代码如下:
最后我要指出本文的局限性,那就是本文中组合框的"顺序性"很强,即组合框中条目格式与我们定义的字符串格式数组、画刷数组、图像数组顺序一样,但如果要求顺序不一样,例如在下面的情况下:用红黄绿三种颜色分别代表三个班级的颜色,即一班所学同学的姓名都用红色表示、二班所有同学的姓名都用黄色表示、三班所有同学的姓名都用绿色表示,这又如何实现呢?有些读者可能会想到用if-else-if语句,但是如果班级有10、100个甚至1000个你还用if-else-if语句吗?这个问题我们留在下一篇文章中解决。 |