ListView OwnerDraw=ture 時,CheckBoxs顯示問題

  • 3422
  • 0
  • 2011-10-05

簡介:若需要改變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