第四步:編程 說明:當我們通過組合框的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類型的數組來儲存我們建立的字串格式與畫刷,於是在類的前面添加如下兩句:
ArrayList brushArray = new ArrayList() ; ArrayList fontArray = new ArrayList() ; |
(4)我們什麼時候建立字串格式組、畫刷組比較合適呢?當然要在畫組合框之前了,不然的話如何用?因此只有在Form1_Load事件中前部建立字串格式、畫刷了。Form1_Load代碼如下:
private void Form1_Load(object sender, System.EventArgs e) { //建立字串格式 fontArray .Add(new Font("Ariel" , 8 , FontStyle.Bold )); fontArray .Add(new Font("Courier" , 8 , FontStyle.Italic)); fontArray .Add(new Font("Veranda" , 8 , FontStyle.Bold)); fontArray .Add(new Font("System" , 8 , FontStyle.Strikeout)); fontArray .Add(new Font("Century SchoolBook" , 8 , FontStyle.Underline)); fontArray .Add(new Font("HeleVCtia" , 8 , FontStyle.Italic)); //建立畫刷 brushArray.Add(new SolidBrush(Color.Red)); brushArray.Add(new SolidBrush(Color.Blue)); brushArray.Add(new SolidBrush(Color.Green)); brushArray.Add(new SolidBrush(Color.Yellow)); brushArray.Add(new SolidBrush(Color.Black)); brushArray.Add(new SolidBrush(Color.Azure)); brushArray.Add(new SolidBrush(Color.Firebrick)); brushArray.Add(new SolidBrush(Color.DarkMagenta)); brushArray.Add(new SolidBrush(Color.DarkTurquoise)); brushArray.Add(new SolidBrush(Color.Khaki)); //畫comboBox1,注意它要調用comboBox1_DrawItem來畫 comboBox1.Items.Add("中國"); comboBox1.Items.Add("巴西"); comboBox1.Items.Add("哥斯達黎加"); comboBox1.Items.Add("土耳其"); comboBox1.Items.Add("韓國"); comboBox1.Items.Add("日本"); //畫comboBox2,注意它要調用comboBox2_DrawItem來畫 comboBox2.Items.Add(""); comboBox2.Items.Add(""); comboBox2.Items.Add(""); comboBox2.Items.Add(""); comboBox2.Items.Add(""); comboBox2.Items.Add(""); comboBox2.Items.Add(""); comboBox2.Items.Add(""); comboBox2.Items.Add(""); comboBox2.Items.Add(""); //畫comboBox3,注意它要調用comboBox3_DrawItem來畫 comboBox3.Items.Add("趙微"); comboBox3.Items.Add("舒淇"); } |
問題:僅從Form_Load的代碼來看三個comboBox,應該差別不大,因為它們的代碼幾乎完全一模一樣,實際情況如何呢?我們還是來看看最終的運行介面吧(3、圖4、圖5)。 圖3 comboBox1:格式變化的組合框
圖4 comboBox2:帶有圖形的組全框
圖5:comboBox3:帶有映像的組合框
|