組合框是組成Windows窗口常見的控件之一,Windows程序員在應用軟件開發中經常要用到組合框。但隨微軟開發工具語言(如C/C++/C#/VB/VF)提供的標准組合框都是同一面孔:組合框中每一項都是字符串,看起來有點灰頭土臉,不那麼賞心悅目(如圖1)。
圖1
今天我們就來給組合框美容一下,使組合框中每一項都帶有個性,組合框中每一項即可以讓字符串格式變化多樣,也可以使每一項都帶有各種圖形,同樣也可以讓每一項都帶有圖像等等。
例1:本例中我們在一個表單上創建三個組合框,從上到下名字分別為comboBox1~comboBox3,通過編程分別讓它們的組合框條目字符串格式發生變化、每項前都有圖形、每項前都有圖像。
第一步:建立項目
建立一名為TestComboBox的Windows應用程序(注:應用程序名可以隨意)。
第二步:界面設計
本例界面比較簡單,三個label,三個組合框(如圖2所示,從上到上組合框名依次為comboBox1、comboBox2、comboBox3),一個imageList控件(當然表單上看不到,在表單設計圖的下方)請按照如圖2排列。
圖2
第三步:控件屬性設置
(1)把三個label的Text屬性按圖2設置;
(2)三個comboBox的屬性進行如下設置:
DrawMode:OwnerDrawFixed;
DropDownStyle:DropDownList;
注:這兩個屬性只有如此設置才能保證我們對組合框進行個性化改造,否則的話無論你的程序寫得多麼好,同樣還是"灰頭土臉,不是那麼賞心悅目。
(3)通過imageList1的Item屬性向imageList增添幾個圖像。
第四步:編程
說明:當我們通過組合框的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類型的數組來保存我們創建的字符串格式與畫刷,於是在類的前面添加如下兩句: