簡介:若需要改變ListView預設的繪圖方式(例如厭倦了選取藍底的顏色),可以將屬性OwnerDraw設為ture,此時就可覆寫OnDrawColumnHeader、OnDrawItem、OnDrawSubItem 這三個方法來自訂繪製。
討論問題:當自訂繪製時,使用DrawListViewItemEventArgs或DrawListViewSubItemEventArgs參數的屬性都無法繪製出CheckBoxs。
簡介:若需要改變ListView預設的繪圖方式(例如厭倦了選取藍底的顏色),可以將屬性OwnerDraw設為ture,此時就可覆寫OnDrawColumnHeader、OnDrawItem、OnDrawSubItem 這三個方法來自訂繪製。
討論問題:當自訂繪製時,使用DrawListViewItemEventArgs或DrawListViewSubItemEventArgs參數的屬性都無法繪製出CheckBoxs。
解決方法:主要在OnDrawSubItem 方法中撰寫代碼,因為繪製所有項目都會執行這個方法,所以OnDrawItem可不用撰寫代碼,接著分為第一個子項目(索引0)與其他的子項目做分別繪製,這是因為索引0的子項目範圍內要繪製CheckBox,而其他的子項目則可使用預設的e.DrawText()方法完成繪製文字。
這裡提供一段在OnDrawSubItem方法中解決顯示CheckBoxs顯示的代碼:
protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
e.DrawBackground();
TextFormatFlags textFormatFlags =TextFormatFlags.Bottom | TextFormatFlags.EndEllipsis;
if (e.Item.SubItems[0] == e.SubItem)
{
Size sizeCheckbox = CheckBoxRenderer.GetGlyphSize(e.Graphics, e.Item.Checked ? VisualStyles.CheckBoxState.CheckedNormal : VisualStyles.CheckBoxState.UncheckedNormal);
Point potCheckbox = new Point(e.Bounds.X, e.Bounds.Top + 1);
Rectangle rectText =new Rectangle(e.Bounds.X + sizeCheckbox.Width + 2, e.Bounds.Y, this.Columns[0].Width - sizeCheckbox.Width - 2, e.Bounds.Height);
CheckBoxRenderer.DrawCheckBox(e.Graphics, potCheckbox, rectText, e.Item.Text, this.Font, textFormatFlags, false , e.Item.Checked ? VisualStyles.CheckBoxState.CheckedNormal : VisualStyles.CheckBoxState.UncheckedNormal);
}
else
{
e.DrawText(textFormatFlags);
}
//
// Raising DrawSubItem event.
//
base.OnDrawSubItem(e);
}
主要是透過 CheckBoxRenderer.DrawCheckBox 靜態方法來繪製CheckBox,且利用 TextFormatFlags 列舉來完成對齊與裁減的功能,最後使用 CheckBoxRenderer.GetGlyphSize 靜態方法取得核取方塊大小,用來計算顯示文字的矩形範圍(Rectangle)。
引用文章請註明出處與作者,謝謝。
作者: jGame
日期: 2011/09/16