【问题标题】:Using ListView owner drawn DrawItem not the same size as the LargeIcon ImageSize使用 ListView 所有者绘制的 DrawItem 大小与 LargeIcon ImageSize 不同
【发布时间】:2020-01-14 14:07:55
【问题描述】:

我在 LargeIcon 视图模式下使用 ListView 来显示 ImageList 中的图像列表。我不想绘制标签或子项,所以我使用 OwnerDraw 和 DrawItem 事件。但是,我似乎无法使项目大小与图像大小相匹配。

我已经尝试调整 ImageList 的大小,以及我存储在列表中的图像,虽然它确实改变了 ListView 中每个项目的大小,但仍然在图像周围绘制了“额外空间”我无法摆脱。

这是我的 DrawItem 事件:

private void listView_Boxes_DrawItem(object sender, DrawListViewItemEventArgs e)
{
  ListView view = (ListView)sender;
  e.DrawDefault = false;
  e.Graphics.DrawImage(view.LargeImageList.Images[e.Item.ImageKey], 0, 0);
  e.DrawFocusRectangle();
}

我的 ImageList ImageSize 设置为 200x200,我正在构建的要放入该列表的图像是 200x200。但这里是项目被绘制的样子:

虚线是 DrawFocusRectangle,表示多余的空间。我猜这个空间是用于标签和子项的,即使它们没有被绘制?有没有办法使用 DrawItem 覆盖删除那些?

感谢您的帮助!

编辑:我猜它与 ListView.Item 上 Bounds 的只读属性有关。如果是这样,有没有办法覆盖边界,或者画到边界?

【问题讨论】:

  • 我只是将图像居中。
  • @LarsTech 嗯,这很容易。谢谢!

标签: winforms listview


【解决方案1】:

根据@LarsTech,我只是抓住了 Bounds 矩形并将该矩形中的图像居中。

private void listView_Boxes_DrawItem(object sender, DrawListViewItemEventArgs e)
{
  ListView view = (ListView)sender;
  e.DrawDefault = false;
  Rectangle rect = e.Bounds;
  int width = rect.Width, height = rect.Height;
  int xPad = width - imageSize, yPad = height - imageSize;
  e.Graphics.DrawImage(view.LargeImageList.Images[e.Item.ImageKey], (int)(xPad/2), (int)(yPad)/2);
  e.DrawFocusRectangle();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多