private void DrawListViewItemIcon(DrawListViewItemEventArgs e)
{
if (_iconSz == 0) return;
ImageListViewItem item = (ImageListViewItem)e.Item;
//e.Bounds.Leftが常に0を指すから自前で計算
Rectangle itemRect = item.Bounds;
var col0 = e.Item.ListView.Columns[0];
itemRect.Width = col0.Width;
if (col0.DisplayIndex > 0)
{
foreach (ColumnHeader clm in e.Item.ListView.Columns)
{
if (clm.DisplayIndex < col0.DisplayIndex)
itemRect.X += clm.Width;
}
}
// ディスプレイの DPI 設定を考慮したアイコンサイズ
var realIconSize = new SizeF(this._iconSz * this.CurrentScaleFactor.Width, this._iconSz * this.CurrentScaleFactor.Height).ToSize();
var realStateSize = new SizeF(16 * this.CurrentScaleFactor.Width, 16 * this.CurrentScaleFactor.Height).ToSize();
Rectangle iconRect;
var img = item.Image;
if (img != null)
{
iconRect = Rectangle.Intersect(new Rectangle(e.Item.GetBounds(ItemBoundsPortion.Icon).Location, realIconSize), itemRect);
iconRect.Offset(0, Math.Max(0, (itemRect.Height - realIconSize.Height) / 2));
if (iconRect.Width > 0)
{
e.Graphics.FillRectangle(Brushes.White, iconRect);
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
try
{
e.Graphics.DrawImage(img.Image, iconRect);
}
catch (ArgumentException)
{
item.RefreshImageAsync();
}
}
}
else
{
iconRect = Rectangle.Intersect(new Rectangle(e.Item.GetBounds(ItemBoundsPortion.Icon).Location, new Size(1, 1)), itemRect);
//iconRect.Offset(0, Math.Max(0, (itemRect.Height - realIconSize.Height) / 2));
item.GetImageAsync();
}
if (item.StateIndex > -1)
{
Rectangle stateRect = Rectangle.Intersect(new Rectangle(new Point(iconRect.X + realIconSize.Width + 2, iconRect.Y), realStateSize), itemRect);
if (stateRect.Width > 0)
{
//e.Graphics.FillRectangle(Brushes.White, stateRect);
//e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.High;
e.Graphics.DrawImage(this.PostStateImageList.Images[item.StateIndex], stateRect);
}
}
}