最近在做一個程序,設置了一個ListBox,在裡面不斷的更新消息,在WinForm的ListBox中默認的顏色只能是單色的,但我需要不同的消息用不同的顏色顯示,默認的ListBox就不能勝任了。經過一番研究之後,通過代碼成功地實現了。其核心就是不用系統默認的ListBox繪制函數,而是自己重寫。
首先在窗體設計器中將ListBox的DrawMode屬性改為OwnerDrawFixed,或是直接在代碼的合適位置中添加如下代碼:
this.ListBoxDemo.DrawMode = DrawMode.OwnerDrawFixed;
這個屬性的作用在MSDN裡的解釋是“控件中的所有元素都是手動繪制的,並且元素大小都相等”,意思就是允許用編程人員用代碼編寫控件繪制。
然後就寫ListBox的DrawItem事件的處理函數:
private void ListBoxDemo_DrawItem(object sender, DrawItemEventArgs e)
...{
string s = ((ListBox)sender).Items[e.Index].ToString(); //獲取該條目要顯示的文字
Color vColor;
switch (s[0])
...{
case ''w'':vColor = Color.Red;s = s.Substring(1);break; //warn
case ''s'':vColor = Color.Blue; s = s.Substring(1); break; //success
case ''f'':vColor = Color.Green; s = s.Substring(1); break; //fail
default: vColor = Color.Black; break;
}
e.Graphics.DrawString(s, e.Font, new SolidBrush(vColor), e.Bounds); //繪制條目
e.DrawFocusRectangle();
}
注:本例中不同類型的消息用不同的顏色繪制,“警告”消息用紅色、“成功”消息用藍色、“失敗”消息用綠色。每種消息之前都用一個字符表示,表明不同的消息種類。然後用Substring(1)方法來去掉第一個字符,以此來正常顯示。以下為效果圖:
用類似的方法還可已設置成間隔的顏色來提高美觀度。