1 原理
微軟的FCL的WinForm部分提供了大量的UI控制項,控制項本身設計的非常精妙,其OwnerDraw屬性設定為false(預設)時,控制項自身會採用預設值進行自動繪製,如果為true時,則在控制項自身需要繪製時,發送事件給父表單,為程式員提供自行編寫繪製代碼的機會。
2 代碼首先是設定 listView1的Owner屬性為true並且把View屬性設定為Details,然後是為DrawColumnHeader、DrawItem、DrawSubItem事件增加處理函數,最後是在處理函數中實現個人化的繪製。
this.listView1.OwnerDraw = true;
this.listView1.View = System.Windows.Forms.View.Details;
this.listView1.DrawColumnHeader += new System.Windows.Forms.DrawListViewColumnHeaderEventHandler(this.listView1_DrawColumnHeader); this.listView1.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(this.listView1_DrawItem); this.listView1.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(this.listView1_DrawSubItem);
//以上兩步可以通過VS開發環境通過滑鼠點擊自動完成。實現部分需要程式員編碼。
//正常繪製單元private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { e.DrawText(); }//把第一列的儲存格背景色設定為藍色 private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) { if (e.ColumnIndex == 0) { e.SubItem.BackColor = Color.Blue; e.DrawBackground(); } e.DrawText(); }
//把標題列的背景色設定為紅色 private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) { e.Graphics.FillRectangle(Brushes.Red, e.Bounds); e.DrawText();//採用預設繪製標題文本 }3 實驗結果