First, the following handler enables or disables custom drawing according to
the view mode.
private void
customListViewEx1_QueryCustomDraw(object sender,
WellFormed.QueryCustomDrawEventArgs e)
{
if(e.View!=View.List)
{
e.Inform=true;
e.Subitems=true;
}
}
This code draws the icons and checkboxes.
void DrawAdornments(ListViewItemPaintEventArgs
e)
{
if(e.SubItemIndex>0)
return;
int
adornmentOffset=2;
CustomListViewEx
lv=(CustomListViewEx)e.Item.ListView;
if(lv.CheckBoxes==true)
{
ControlPaint.DrawCheckBox(e.Graphics,
new
Rectangle(e.ItemRect.Left+adornmentOffset,
e.ItemRect.Top+e.ItemRect.Size.Height/2-SystemInformation.MenuCheckSize.Height/2,
SystemInformation.MenuCheckSize.Width,
SystemInformation.MenuCheckSize.Height),
e.Item.Checked
? ButtonState.Checked : ButtonState.Normal);
adornmentOffset+=SystemInformation.MenuCheckSize.Width;
}
if(lv.SmallImageList!=null
&& e.Item.ImageIndex>-1)
{
e.Graphics.DrawImage(e.Item.ImageList.Images[e.Item.ImageIndex],
new
Rectangle(e.ItemRect.Left+adornmentOffset,
e.ItemRect.Top+e.ItemRect.Height/2-e.Item.ImageList.ImageSize.Height/2,
e.Item.ImageList.ImageSize.Width,
e.Item.ImageList.ImageSize.Height),
0,0,e.Item.ImageList.ImageSize.Width,e.Item.ImageList.ImageSize.Height,
GraphicsUnit.Pixel);
adornmentOffset+=e.Item.ImageList.ImageSize.Width;
}
}
This event handler draws
three different custom view styles
private
void customListViewEx1_PaintItem(object
sender, WellFormed.ListViewItemPaintEventArgs e)
{
switch(e.View)
{
case
View.Details:
{
Brush[] b=new Brush[]{Brushes.Red,
Brushes.Blue, Brushes.Green,Brushes.DarkRed,Brushes.DarkBlue,
Brushes.DarkGreen};
if(!e.IsSubItem)
{
e.DrawSubItems=true;
e.DoDefault=false;
}
else
{
Rectangle rc=new
Rectangle(e.ItemRect.Left+e.ItemOffset, e.ItemRect.Top+2,
e.ItemRect.Width-e.ItemOffset, e.ItemRect.Height);
if(e.Item.Selected)
{
e.Graphics.FillRectangle(b[e.SubItemIndex+3],e.ItemRect);
this.DrawAdornments(e);
e.Graphics.DrawString(e.Item.SubItems[e.SubItemIndex].Text,Font,Brushes.White,rc);
}
else
{
e.Graphics.FillRectangle(b[e.SubItemIndex],e.ItemRect);
this.DrawAdornments(e);
e.Graphics.DrawString(e.Item.SubItems[e.SubItemIndex].Text,Font,Brushes.Black,rc);
}
}
}
break;
case
View.LargeIcon:
{
SolidBrush sb=new
SolidBrush(e.Item.ListView.BackColor);
e.Graphics.FillRectangle(sb,e.ItemRect);
e.Graphics.DrawImage(e.Item.ImageList.Images[e.Item.ImageIndex],
new
Rectangle(e.ItemRect.Left+e.ItemRect.Width/2-e.Item.ImageList.ImageSize.Width/2,
e.ItemRect.Top+2,
e.Item.ImageList.ImageSize.Width,
e.Item.ImageList.ImageSize.Height),
0,0,
e.Item.ImageList.ImageSize.Width,
e.Item.ImageList.ImageSize.Height,
GraphicsUnit.Pixel);
if(e.Item.Selected)
e.Graphics.DrawRectangle(Pens.Orange,
e.ItemRect.Left+e.ItemRect.Width/2-e.Item.ImageList.ImageSize.Width/2,
e.ItemRect.Top+2,
e.Item.ImageList.ImageSize.Width,
e.Item.ImageList.ImageSize.Height);
Rectangle textrc=new Rectangle(
e.ItemRect.Left,
e.ItemRect.Top+2+e.Item.ImageList.ImageSize.Height,
e.ItemRect.Width,
e.ItemRect.Height-(2+e.Item.ImageList.ImageSize.Height));
StringFormat sf=(StringFormat)StringFormat.GenericDefault.Clone();
sf.Trimming=StringTrimming.EllipsisCharacter;
sf.Alignment=StringAlignment.Center;
sb.Color=e.Item.ListView.ForeColor;
Font selectedFont=new
Font("Arial",e.Item.ListView.Font.SizeInPoints,FontStyle.Bold,GraphicsUnit.Point);
if(e.Item.Selected)
{
sb.Color=Color.Green;
e.Graphics.DrawString(e.Item.Text,selectedFont,sb,textrc,sf);
}
else
e.Graphics.DrawString(e.Item.Text,e.Item.ListView.Font,sb,textrc,sf);
selectedFont.Dispose();
sf.Dispose();
sb.Dispose();
}
break;
case
View.SmallIcon:
{
SolidBrush sb=new
SolidBrush(e.Item.ListView.BackColor);
e.Graphics.FillRectangle(sb,e.ItemRect);
e.Graphics.DrawImage(e.Item.ImageList.Images[e.Item.ImageIndex],
new
Rectangle(e.ItemRect.Left,
e.ItemRect.Top+e.ItemRect.Height/2-e.Item.ImageList.ImageSize.Height/2,
e.Item.ImageList.ImageSize.Width,
e.Item.ImageList.ImageSize.Height),
0,
0,
e.Item.ImageList.ImageSize.Width,
e.Item.ImageList.ImageSize.Height,
GraphicsUnit.Pixel);
Rectangle textrc=new Rectangle(
e.ItemRect.Left+e.Item.ImageList.ImageSize.Width,
e.ItemRect.Top+2,
e.ItemRect.Width-e.Item.ImageList.ImageSize.Width,
e.ItemRect.Height);
StringFormat
sf=(StringFormat)StringFormat.GenericDefault.Clone();
sf.Trimming=StringTrimming.EllipsisCharacter;
sf.Alignment=StringAlignment.Near;
sb.Color=e.Item.ListView.ForeColor;
Font selectedFont=new
Font("Arial",e.Item.ListView.Font.SizeInPoints,FontStyle.Bold,GraphicsUnit.Point);
if(e.Item.Selected)
{
sb.Color=Color.Green;
e.Graphics.DrawString(e.Item.Text,selectedFont,sb,textrc,sf);
}
else
e.Graphics.DrawString(e.Item.Text,e.Item.ListView.Font,sb,textrc,sf);
selectedFont.Dispose();
}
break;
case
View.List:
break;
}
}