/// <summary> /// Draws the large preview image of the focused item in Gallery mode. /// </summary> /// <param name="g">The System.Drawing.Graphics to draw on.</param> /// <param name="item">The ImageListViewItem to draw.</param> /// <param name="image">The image to draw.</param> /// <param name="bounds">The bounding rectangle of the preview area.</param> public override void DrawGalleryImage(Graphics g, ImageListViewItem item, Image image, Rectangle bounds) { if (item != null && image != null) { Size itemMargin = MeasureItemMargin(ImageListView.View); Rectangle pos = Utility.GetSizedImageBounds(image, new Rectangle(bounds.X + itemMargin.Width, bounds.Y + itemMargin.Height, bounds.Width - 2 * itemMargin.Width, bounds.Height - 2 * itemMargin.Height - mReflectionSize), 50.0f, 100.0f); DrawImageWithReflection(g, image, pos, mReflectionSize); } }
/// <summary> /// Draws the large preview image of the focused item in Gallery mode. /// </summary> /// <param name="g">The System.Drawing.Graphics to draw on.</param> /// <param name="item">The ImageListViewItem to draw.</param> /// <param name="image">The image to draw.</param> /// <param name="bounds">The bounding rectangle of the preview area.</param> public override void DrawGalleryImage(Graphics g, ImageListViewItem item, Image image, Rectangle bounds) { // Calculate image bounds Size itemMargin = MeasureItemMargin(mImageListView.View); Rectangle pos = Utility.GetSizedImageBounds(image, new Rectangle(bounds.Location + itemMargin, bounds.Size - itemMargin - itemMargin)); // Draw image g.DrawImage(image, pos); // Draw image border if (Math.Min(pos.Width, pos.Height) > 32) { using (Pen pBorder = new Pen(Color.Black)) { g.DrawRectangle(pBorder, pos); } } }
/// <summary> /// Draws the specified item on the given graphics. /// </summary> /// <param name="g">The System.Drawing.Graphics to draw on.</param> /// <param name="item">The ImageListViewItem to draw.</param> /// <param name="state">The current view state of item.</param> /// <param name="bounds">The bounding rectangle of item in client coordinates.</param> public override void DrawItem(Graphics g, ImageListViewItem item, ItemState state, Rectangle bounds) { // Fill with item background color if (item.BackColor != Color.Transparent) { using (Brush brush = new SolidBrush(item.BackColor)) { g.FillRectangle(brush, bounds); } } if (ImageListView.View == View.Details) { // Item background if ((state & ItemState.Selected) == ItemState.Selected) { using (Brush brush = new LinearGradientBrush(bounds, Color.FromArgb(64, 96, 160), Color.FromArgb(64, 64, 96, 160), LinearGradientMode.Horizontal)) { g.FillRectangle(brush, bounds); } } else if ((state & ItemState.Hovered) == ItemState.Hovered) { using (Brush brush = new LinearGradientBrush(bounds, Color.FromArgb(64, Color.White), Color.FromArgb(16, Color.White), LinearGradientMode.Horizontal)) { g.FillRectangle(brush, bounds); } } // Shade sort column List <ImageListView.ImageListViewColumnHeader> uicolumns = mImageListView.Columns.GetDisplayedColumns(); int x = mImageListView.layoutManager.ColumnHeaderBounds.Left; foreach (ImageListView.ImageListViewColumnHeader column in uicolumns) { if (mImageListView.SortColumn == column.Type && mImageListView.SortOrder != SortOrder.None && (state & ItemState.Hovered) == ItemState.None && (state & ItemState.Selected) == ItemState.None) { Rectangle subItemBounds = bounds; subItemBounds.X = x; subItemBounds.Width = column.Width; using (Brush brush = new SolidBrush(Color.FromArgb(32, 128, 128, 128))) { g.FillRectangle(brush, subItemBounds); } break; } x += column.Width; } // Separators x = mImageListView.layoutManager.ColumnHeaderBounds.Left; foreach (ImageListView.ImageListViewColumnHeader column in uicolumns) { x += column.Width; if (!ReferenceEquals(column, uicolumns[uicolumns.Count - 1])) { using (Pen pen = new Pen(Color.FromArgb(64, 128, 128, 128))) { g.DrawLine(pen, x, bounds.Top, x, bounds.Bottom); } } } // Item texts Size offset = new Size(2, (bounds.Height - mImageListView.Font.Height) / 2); using (StringFormat sf = new StringFormat()) { sf.FormatFlags = StringFormatFlags.NoWrap; sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Center; sf.Trimming = StringTrimming.EllipsisCharacter; // Sub text RectangleF rt = new RectangleF(bounds.Left + offset.Width, bounds.Top + offset.Height, uicolumns[0].Width - 2 * offset.Width, bounds.Height - 2 * offset.Height); foreach (ImageListView.ImageListViewColumnHeader column in uicolumns) { rt.Width = column.Width - 2 * offset.Width; using (Brush bItemFore = new SolidBrush(Color.White)) { g.DrawString(item.GetSubItemText(column.Type), mImageListView.Font, bItemFore, rt, sf); } rt.X += column.Width; } } // Border if ((state & ItemState.Hovered) == ItemState.Hovered) { using (Pen pen = new Pen(Color.FromArgb(128, Color.White))) { g.DrawRectangle(pen, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1); } } else if ((state & ItemState.Selected) == ItemState.Hovered) { using (Pen pen = new Pen(Color.FromArgb(96, 144, 240))) { g.DrawRectangle(pen, bounds.X, bounds.Y, bounds.Width - 1, bounds.Height - 1); } } } else { // Align images to bottom of bounds Image img = item.ThumbnailImage; Rectangle pos = Utility.GetSizedImageBounds(img, new Rectangle(bounds.X + padding, bounds.Y + padding, bounds.Width - 2 * padding, bounds.Height - 2 * padding - mReflectionSize), 50.0f, 100.0f); int x = pos.X; int y = pos.Y; // Item background if ((state & ItemState.Selected) == ItemState.Selected) { using (Brush brush = new LinearGradientBrush( new Point(x - padding, y - padding), new Point(x - padding, y + pos.Height + 2 * padding), Color.FromArgb(64, 96, 160), Color.FromArgb(16, 16, 16))) { g.FillRectangle(brush, x - padding, y - padding, pos.Width + 2 * padding, pos.Height + 2 * padding); } } else if ((state & ItemState.Hovered) == ItemState.Hovered) { using (Brush brush = new LinearGradientBrush( new Point(x - padding, y - padding), new Point(x - padding, y + pos.Height + 2 * padding), Color.FromArgb(64, Color.White), Color.FromArgb(16, 16, 16))) { g.FillRectangle(brush, x - padding, y - padding, pos.Width + 2 * padding, pos.Height + 2 * padding); } } // Border if ((state & ItemState.Hovered) == ItemState.Hovered) { using (Brush brush = new LinearGradientBrush( new Point(x - padding, y - padding), new Point(x - padding, y + pos.Height + 2 * padding), Color.FromArgb(128, Color.White), Color.FromArgb(16, 16, 16))) using (Pen pen = new Pen(brush)) { g.DrawRectangle(pen, x - padding, y - padding + 1, pos.Width + 2 * padding - 1, pos.Height + 2 * padding - 1); } } else if ((state & ItemState.Selected) == ItemState.Selected) { using (Brush brush = new LinearGradientBrush( new Point(x - padding, y - padding), new Point(x - padding, y + pos.Height + 2 * padding), Color.FromArgb(96, 144, 240), Color.FromArgb(16, 16, 16))) using (Pen pen = new Pen(brush)) { g.DrawRectangle(pen, x - padding, y - padding + 1, pos.Width + 2 * padding - 1, pos.Height + 2 * padding - 1); } } // Draw item image DrawImageWithReflection(g, img, pos, mReflectionSize); DrawThumbnail(g, item, img, pos, drawThumbnail: false); // Highlight using (Pen pen = new Pen(Color.FromArgb(160, Color.White))) { g.DrawLine(pen, pos.X, pos.Y + 1, pos.X + pos.Width - 1, pos.Y + 1); g.DrawLine(pen, pos.X, pos.Y + 1, pos.X, pos.Y + pos.Height); } } }
/// <summary> /// Draws the left pane in Pane view mode. /// </summary> /// <param name="g">The System.Drawing.Graphics to draw on.</param> /// <param name="item">The ImageListViewItem to draw.</param> /// <param name="image">The image to draw.</param> /// <param name="bounds">The bounding rectangle of the pane.</param> public override void DrawPane(Graphics g, ImageListViewItem item, Image image, Rectangle bounds) { // Draw resize handle using (Brush bBorder = new SolidBrush(Color.FromArgb(64, 64, 64))) { g.FillRectangle(bBorder, bounds.Right - 2, bounds.Top, 2, bounds.Height); } bounds.Width -= 2; if (item != null && image != null) { // Calculate image bounds Size itemMargin = MeasureItemMargin(ImageListView.View); Rectangle pos = Utility.GetSizedImageBounds(image, new Rectangle(bounds.Location + itemMargin, bounds.Size - itemMargin - itemMargin), 50.0f, 0.0f); // Draw image g.DrawImage(image, pos); bounds.X += itemMargin.Width; bounds.Width -= 2 * itemMargin.Width; bounds.Y = pos.Height + 16; bounds.Height -= pos.Height + 16; // Item text if (mImageListView.Columns[ColumnType.FileName].Visible && bounds.Height > 0) { int y = Utility.DrawStringPair(g, bounds, "", item.Text, mImageListView.Font, Brushes.White, Brushes.White); bounds.Y += 2 * y; bounds.Height -= 2 * y; } // File type if (mImageListView.Columns[ColumnType.FileType].Visible && bounds.Height > 0 && !string.IsNullOrWhiteSpace(item.FileType)) { using (Brush bCaption = new SolidBrush(Color.FromArgb(196, 196, 196))) using (Brush bText = new SolidBrush(Color.White)) { int y = Utility.DrawStringPair(g, bounds, mImageListView.Columns[ColumnType.FileType].Text + ": ", item.FileType, mImageListView.Font, bCaption, bText); bounds.Y += y; bounds.Height -= y; } } // Metatada foreach (ImageListView.ImageListViewColumnHeader column in mImageListView.Columns) { if (column.Type == ColumnType.MediaDescription) { bounds.Y += 8; bounds.Height -= 8; } if (bounds.Height <= 0) { break; } if (column.Visible && column.Type != ColumnType.FileType && column.Type != ColumnType.FileDateCreated && column.Type != ColumnType.FileFullPath && column.Type != ColumnType.FileDirectory && column.Type != ColumnType.FileName) { string caption = column.Text; string text = item.GetSubItemText(column.Type); if (!string.IsNullOrWhiteSpace(text)) { using (Brush bCaption = new SolidBrush(Color.FromArgb(196, 196, 196))) using (Brush bText = new SolidBrush(Color.White)) { int y = Utility.DrawStringPair(g, bounds, caption + ": ", text, mImageListView.Font, bCaption, bText); bounds.Y += y; bounds.Height -= y; } } } } } }
/// <summary> /// Draws the specified item on the given graphics. /// </summary> /// <param name="g">The System.Drawing.Graphics to draw on.</param> /// <param name="item">The ImageListViewItem to draw.</param> /// <param name="state">The current view state of item.</param> /// <param name="bounds">The bounding rectangle of item in client coordinates.</param> public override void DrawItem(Graphics g, ImageListViewItem item, ItemState state, Rectangle bounds) { if (ImageListView.View == Manina.Windows.Forms.View.Thumbnails) { // Zoom on mouse over if ((state & ItemState.Hovered) != ItemState.None) { bounds.Inflate((int)(bounds.Width * mZoomRatio), (int)(bounds.Height * mZoomRatio)); if (bounds.Bottom > ItemAreaBounds.Bottom) { bounds.Y = ItemAreaBounds.Bottom - bounds.Height; } if (bounds.Top < ItemAreaBounds.Top) { bounds.Y = ItemAreaBounds.Top; } if (bounds.Right > ItemAreaBounds.Right) { bounds.X = ItemAreaBounds.Right - bounds.Width; } if (bounds.Left < ItemAreaBounds.Left) { bounds.X = ItemAreaBounds.Left; } } // Get item image Image img = null; if ((state & ItemState.Hovered) != ItemState.None) { img = GetImageAsync(item, new Size(bounds.Width - 8, bounds.Height - 8)); } if (img == null) { img = item.ThumbnailImage; } // Calculate image bounds Rectangle pos = Utility.GetSizedImageBounds(img, Rectangle.Inflate(bounds, -4, -4)); int imageWidth = pos.Width; int imageHeight = pos.Height; int imageX = pos.X; int imageY = pos.Y; // Allocate space for item text if ((state & ItemState.Hovered) != ItemState.None && (bounds.Height - imageHeight) / 2 < ImageListView.Font.Height + 8) { int delta = (ImageListView.Font.Height + 8) - (bounds.Height - imageHeight) / 2; bounds.Height += 2 * delta; imageY += delta; } // Paint background using (Brush bBack = new SolidBrush(ImageListView.BackColor)) { Utility.FillRoundedRectangle(g, bBack, bounds, 5); } using (Brush bItemBack = new SolidBrush(item.BackColor)) { Utility.FillRoundedRectangle(g, bItemBack, bounds, 5); } if ((ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) || (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None) && ((state & ItemState.Hovered) != ItemState.None))) { using (Brush bSelected = new LinearGradientBrush(bounds, Color.FromArgb(16, SystemColors.Highlight), Color.FromArgb(64, SystemColors.Highlight), LinearGradientMode.Vertical)) { Utility.FillRoundedRectangle(g, bSelected, bounds, 5); } } else if (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { using (Brush bGray64 = new LinearGradientBrush(bounds, Color.FromArgb(16, SystemColors.GrayText), Color.FromArgb(64, SystemColors.GrayText), LinearGradientMode.Vertical)) { Utility.FillRoundedRectangle(g, bGray64, bounds, 5); } } if (((state & ItemState.Hovered) != ItemState.None)) { using (Brush bHovered = new LinearGradientBrush(bounds, Color.FromArgb(8, SystemColors.Highlight), Color.FromArgb(32, SystemColors.Highlight), LinearGradientMode.Vertical)) { Utility.FillRoundedRectangle(g, bHovered, bounds, 5); } } // Draw the image //g.DrawImage(img, pos); DrawThumbnail(g, item, img, pos); // Draw image border if (Math.Min(imageWidth, imageHeight) > 32) { using (Pen pGray128 = new Pen(Color.FromArgb(128, Color.Gray))) { g.DrawRectangle(pGray128, imageX, imageY, imageWidth, imageHeight); } if (System.Math.Min(imageWidth, imageHeight) > 32) { using (Pen pWhite128 = new Pen(Color.FromArgb(128, Color.White))) { g.DrawRectangle(pWhite128, imageX + 1, imageY + 1, imageWidth - 2, imageHeight - 2); } } } // Draw item text if ((state & ItemState.Hovered) != ItemState.None) { RectangleF rt; using (StringFormat sf = new StringFormat()) { rt = new RectangleF(bounds.Left + 4, bounds.Top + 4, bounds.Width - 8, (bounds.Height - imageHeight) / 2 - 8); sf.Alignment = StringAlignment.Center; sf.FormatFlags = StringFormatFlags.NoWrap; sf.LineAlignment = StringAlignment.Center; sf.Trimming = StringTrimming.EllipsisCharacter; using (Brush bItemFore = new SolidBrush(item.ForeColor)) { g.DrawString(item.Text, ImageListView.Font, bItemFore, rt, sf); } rt.Y = bounds.Bottom - (bounds.Height - imageHeight) / 2 + 4; string details = ""; if (item.Dimensions != Size.Empty) { details += item.GetSubItemText(ColumnType.MediaDimensions) + " pixels "; } if (item.FileSize != 0) { details += item.GetSubItemText(ColumnType.FileSize); } using (Brush bGrayText = new SolidBrush(Color.Gray)) { g.DrawString(details, ImageListView.Font, bGrayText, rt, sf); } } } // Item border using (Pen pWhite128 = new Pen(Color.FromArgb(128, Color.White))) { Utility.DrawRoundedRectangle(g, pWhite128, bounds.Left + 1, bounds.Top + 1, bounds.Width - 3, bounds.Height - 3, 4); } if (ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { using (Pen pHighlight128 = new Pen(Color.FromArgb(128, SystemColors.Highlight))) { Utility.DrawRoundedRectangle(g, pHighlight128, bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1, 4); } } else if (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { using (Pen pGray128 = new Pen(Color.FromArgb(128, SystemColors.GrayText))) { Utility.DrawRoundedRectangle(g, pGray128, bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1, 4); } } else if ((state & ItemState.Selected) == ItemState.None) { using (Pen pGray64 = new Pen(Color.FromArgb(64, SystemColors.GrayText))) { Utility.DrawRoundedRectangle(g, pGray64, bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1, 4); } } if (ImageListView.Focused && ((state & ItemState.Hovered) != ItemState.None)) { using (Pen pHighlight64 = new Pen(Color.FromArgb(64, SystemColors.Highlight))) { Utility.DrawRoundedRectangle(g, pHighlight64, bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1, 4); } } } else { base.DrawItem(g, item, state, bounds); } }
/// <summary> /// Draws the specified item on the given graphics. /// </summary> /// <param name="g">The System.Drawing.Graphics to draw on.</param> /// <param name="item">The ImageListViewItem to draw.</param> /// <param name="state">The current view state of item.</param> /// <param name="bounds">The bounding rectangle of item in client coordinates.</param> public override void DrawItem(System.Drawing.Graphics g, ImageListViewItem item, ItemState state, System.Drawing.Rectangle bounds) { // Paint background using (Brush bItemBack = new SolidBrush(item.BackColor)) { g.FillRectangle(bItemBack, bounds); } if (ImageListView.View != Manina.Windows.Forms.View.Details) { Size itemPadding = new Size(4, 4); // Draw the image Image img = item.ThumbnailImage; if (img != null) { Rectangle border = new Rectangle(bounds.Location + itemPadding, ImageListView.ThumbnailSize); Rectangle pos = Utility.GetSizedImageBounds(img, border); //g.DrawImage(img, pos); DrawThumbnail(g, item, img, pos); // Draw image border if (ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { using (Pen pen = new Pen(SystemColors.Highlight, 3)) { g.DrawRectangle(pen, border); } } else if (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { using (Pen pen = new Pen(SystemColors.GrayText, 3)) { pen.Alignment = PenAlignment.Center; g.DrawRectangle(pen, border); } } else { using (Pen pGray128 = new Pen(Color.FromArgb(128, SystemColors.GrayText))) { g.DrawRectangle(pGray128, border); } } } // Draw item text SizeF szt = TextRenderer.MeasureText(item.Text, ImageListView.Font); RectangleF rt; using (StringFormat sf = new StringFormat()) { rt = new RectangleF(bounds.Left + itemPadding.Width, bounds.Top + 3 * itemPadding.Height + ImageListView.ThumbnailSize.Height, ImageListView.ThumbnailSize.Width, szt.Height); sf.Alignment = StringAlignment.Center; sf.FormatFlags = StringFormatFlags.NoWrap; sf.LineAlignment = StringAlignment.Center; sf.Trimming = StringTrimming.EllipsisCharacter; rt.Width += 1; rt.Inflate(1, 2); if (ImageListView.Focused && ((state & ItemState.Focused) != ItemState.None)) { rt.Inflate(-1, -1); } if (ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { g.FillRectangle(SystemBrushes.Highlight, rt); } else if (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { g.FillRectangle(SystemBrushes.GrayText, rt); } if (((state & ItemState.Selected) != ItemState.None)) { g.DrawString(item.Text, ImageListView.Font, SystemBrushes.HighlightText, rt, sf); } else { using (Brush bItemFore = new SolidBrush(item.ForeColor)) { g.DrawString(item.Text, ImageListView.Font, bItemFore, rt, sf); } } } if (ImageListView.Focused && ((state & ItemState.Focused) != ItemState.None)) { Rectangle fRect = Rectangle.Round(rt); fRect.Inflate(1, 1); ControlPaint.DrawFocusRectangle(g, fRect); } } else { if (ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { g.FillRectangle(SystemBrushes.Highlight, bounds); } else if (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { g.FillRectangle(SystemBrushes.GrayText, bounds); } Size offset = new Size(2, (bounds.Height - ImageListView.Font.Height) / 2); using (StringFormat sf = new StringFormat()) { sf.FormatFlags = StringFormatFlags.NoWrap; sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Center; sf.Trimming = StringTrimming.EllipsisCharacter; // Sub text List <ImageListView.ImageListViewColumnHeader> uicolumns = ImageListView.Columns.GetDisplayedColumns(); RectangleF rt = new RectangleF(bounds.Left + offset.Width, bounds.Top + offset.Height, uicolumns[0].Width - 2 * offset.Width, bounds.Height - 2 * offset.Height); foreach (ImageListView.ImageListViewColumnHeader column in uicolumns) { rt.Width = column.Width - 2 * offset.Width; using (Brush bItemFore = new SolidBrush(item.ForeColor)) { if ((state & ItemState.Selected) == ItemState.None) { g.DrawString(item.GetSubItemText(column.Type), ImageListView.Font, bItemFore, rt, sf); } else { g.DrawString(item.GetSubItemText(column.Type), ImageListView.Font, SystemBrushes.HighlightText, rt, sf); } } rt.X += column.Width; } } if (ImageListView.Focused && ((state & ItemState.Focused) != ItemState.None)) { ControlPaint.DrawFocusRectangle(g, bounds); } } }
/// <summary> /// Draws the specified item on the given graphics. /// </summary> /// <param name="g">The System.Drawing.Graphics to draw on.</param> /// <param name="item">The ImageListViewItem to draw.</param> /// <param name="state">The current view state of item.</param> /// <param name="bounds">The bounding rectangle of item in client coordinates.</param> public override void DrawItem(Graphics g, ImageListViewItem item, ItemState state, Rectangle bounds) { if (ImageListView.View == Manina.Windows.Forms.View.Thumbnails) { Size itemPadding = new Size(4, 4); #region Paint background using (Brush bItemBack = new SolidBrush(item.BackColor)) { g.FillRectangle(bItemBack, bounds); } if ((ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) || (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None) && ((state & ItemState.Hovered) != ItemState.None))) { using (Brush bSelected = new LinearGradientBrush(bounds, Color.FromArgb(16, SystemColors.Highlight), Color.FromArgb(64, SystemColors.Highlight), LinearGradientMode.Vertical)) { Utility.FillRoundedRectangle(g, bSelected, bounds, 4); } } else if (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { using (Brush bGray64 = new LinearGradientBrush(bounds, Color.FromArgb(16, SystemColors.GrayText), Color.FromArgb(64, SystemColors.GrayText), LinearGradientMode.Vertical)) { Utility.FillRoundedRectangle(g, bGray64, bounds, 4); } } if (((state & ItemState.Hovered) != ItemState.None)) { using (Brush bHovered = new LinearGradientBrush(bounds, Color.FromArgb(8, SystemColors.Highlight), Color.FromArgb(32, SystemColors.Highlight), LinearGradientMode.Vertical)) { Utility.FillRoundedRectangle(g, bHovered, bounds, 4); } } #endregion #region Draw the image and Title(s) Image img = item.ThumbnailImage; if (img != null) { Rectangle pos = Utility.GetSizedImageBounds(img, new Rectangle(bounds.Location + itemPadding, ImageListView.ThumbnailSize), 0.0f, 50.0f); g.DrawImage(img, pos); DrawThumbnail(g, item, img, pos); // Draw image border if (Math.Min(pos.Width, pos.Height) > 32) { using (Pen pGray128 = new Pen(Color.FromArgb(128, Color.Gray))) { g.DrawRectangle(pGray128, pos); } using (Pen pWhite128 = new Pen(Color.FromArgb(128, Color.White))) { g.DrawRectangle(pWhite128, Rectangle.Inflate(pos, -1, -1)); } } // Draw item text int lineHeight = CaptionFont.Height; RectangleF rt; using (StringFormat sf = new StringFormat()) { rt = new RectangleF(bounds.Left + 2 * itemPadding.Width + ImageListView.ThumbnailSize.Width, bounds.Top + itemPadding.Height + (Math.Max(ImageListView.ThumbnailSize.Height, mTextHeight) - mTextHeight) / 2, mTileWidth, lineHeight); sf.Alignment = StringAlignment.Near; sf.FormatFlags = StringFormatFlags.NoWrap; sf.LineAlignment = StringAlignment.Center; sf.Trimming = StringTrimming.EllipsisCharacter; using (Brush bItemFore = new SolidBrush(item.ForeColor)) { g.DrawString(item.GetSubItemText(ImageListView.TitleLine1), CaptionFont, bItemFore, rt, sf); } using (Brush bItemDetails = new SolidBrush(Color.Gray)) { //Line 2 : rt.Offset(0, 1.5f * lineHeight); string line; try { line = item.GetSubItemText(ImageListView.TitleLine2); g.DrawString(line, ImageListView.Font, bItemDetails, rt, sf); rt.Offset(0, 1.1f * lineHeight); line = item.GetSubItemText(ImageListView.TitleLine3); g.DrawString(line, ImageListView.Font, bItemDetails, rt, sf); rt.Offset(0, 1.1f * lineHeight); line = item.GetSubItemText(ImageListView.TitleLine4); g.DrawString(line, ImageListView.Font, bItemDetails, rt, sf); rt.Offset(0, 1.1f * lineHeight); line = item.GetSubItemText(ImageListView.TitleLine5); g.DrawString(line, ImageListView.Font, bItemDetails, rt, sf); rt.Offset(0, 1.1f * lineHeight); } catch (Exception ex) { Console.WriteLine(ex.Message); //For debug reason //Error can occure when ImageListView.Font } } } } #endregion #region Item border using (Pen pWhite128 = new Pen(Color.FromArgb(128, Color.White))) { Utility.DrawRoundedRectangle(g, pWhite128, bounds.Left + 1, bounds.Top + 1, bounds.Width - 3, bounds.Height - 3, 4); } if (ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { using (Pen pHighlight128 = new Pen(Color.FromArgb(128, SystemColors.Highlight))) { Utility.DrawRoundedRectangle(g, pHighlight128, bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1, 4); } } else if (!ImageListView.Focused && ((state & ItemState.Selected) != ItemState.None)) { using (Pen pGray128 = new Pen(Color.FromArgb(128, SystemColors.GrayText))) { Utility.DrawRoundedRectangle(g, pGray128, bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1, 4); } } else if ((state & ItemState.Selected) == ItemState.None) { using (Pen pGray64 = new Pen(Color.FromArgb(64, SystemColors.GrayText))) { Utility.DrawRoundedRectangle(g, pGray64, bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1, 4); } } if (ImageListView.Focused && ((state & ItemState.Hovered) != ItemState.None)) { using (Pen pHighlight64 = new Pen(Color.FromArgb(64, SystemColors.Highlight))) { Utility.DrawRoundedRectangle(g, pHighlight64, bounds.Left, bounds.Top, bounds.Width - 1, bounds.Height - 1, 4); } } #endregion #region Focus rectangle if (ImageListView.Focused && ((state & ItemState.Focused) != ItemState.None)) { ControlPaint.DrawFocusRectangle(g, bounds); } #endregion } else { Image img = item.ThumbnailImage; //JTN Added - Force image cahcing to be triggered base.DrawItem(g, item, state, bounds); } }