原来的问题(见更新以下)

我有它的程序,需要一个体面的滚动标的控制与大型图标(128×128或更大的略图,真正),可点击对高亮或双击执行一些行动。最好会有极小的空间浪费(短的文件的标题可能需要下文每个标;如果文件是太长了,我可以添加一个省略号).

finished version of listview with proper colors, spacing, etc.
(资料来源: updike.org)

我试图用一个列表视图与LargeIcon(默认。图)和结果都令人失望的:

screenshot showing tiny icons in LargeIcon view
(资料来源: updike.org)

也许我填充的控制不正确?代码:

        ImageList ilist = new ImageList();
        this.listView.LargeImageList = ilist;
        int i = 0;
        foreach (GradorCacheFile gcf in gc.files)
        {
            Bitmap b = gcf.image128;
            ilist.Images.Add(b);
            ListViewItem lvi = new ListViewItem("text");
            lvi.ImageIndex = i;
            this.listView.Items.Add(lvi);
            i++;
        }

我需要大型图标很少空间,不大的空的空间,用令人尴尬的小型图标。

  1. 是有一个.净控制,并什么我需要什么?
    • 有最喜欢的第三方控制,这是否?
    • 如果不是,它的控制将是最好的继承和调整,以使它工作?
    • 我应该打破,做一个自定义控制(我有丰富的经验。只是不想去那个极端,因为这是有点牵涉).

我找到了 这一教程有关OwnerDraw 但工作从这一基本数额数量的3个或4个以上由于这一演示了如何调剂中的行详细查看。

更新

增加的线路

ilist.ImageSize = new Size(128, 128);

前对环固定的尺寸的问题,但现在图像正的调色板化至8位(看起来像系统颜色?) 虽然调试器显示图像插入ImageList为24bpp系统。图。位:

large icons, finally
(资料来源: updike.org)

  1. 我如何(可以吗?) 使这些图像显示在全24位的颜色?
    • 间隔周围的图标仍然是相当浪费的...我怎么解决?可以吗?

更新2

随着加入的线

ilist.ColorDepth = ColorDepth.Depth24Bit;

接下来之后设定ilist.ImageSize,我随后仲裁者的意见和改变的间距:

[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

public int MakeLong(short lowPart, short highPart)
{
    return (int)(((ushort)lowPart) | (uint)(highPart << 16));
}

public void ListView_SetSpacing(ListView listview, short cx, short cy)
{
    const int LVM_FIRST = 0x1000;
    const int LVM_SETICONSPACING = LVM_FIRST + 53;
    // http://msdn.microsoft.com/en-us/library/bb761176(VS.85).aspx
    // minimum spacing = 4
    SendMessage(listview.Handle, LVM_SETICONSPACING,
    IntPtr.Zero, (IntPtr)MakeLong(cx, cy));

    // http://msdn.microsoft.com/en-us/library/bb775085(VS.85).aspx
    // DOESN'T WORK!
    // can't find ListView_SetIconSpacing in dll comctl32.dll
    //ListView_SetIconSpacing(listView.Handle, 5, 5);
}

///////////////////////////////////////////////////////////

ListView_SetSpacing(this.listView, 128 + 12, 128 + 4 + 20);

列表视图控制可能不是完美的或有违约,我期望(就像一个间距酒店)但是我很高兴我可以驯服它,在结束:

alt text
(资料来源: updike.org)

通过该方式,要保持适当比例方面的略图,我不得不让我自己的128×128位图,清楚的背景相匹配的控制,这些中心的图片:

public void CenterDrawImage(Bitmap target, Color background, Bitmap centerme)
{
    Graphics g = Graphics.FromImage(target);
    g.Clear(background);
    int x = (target.Width - centerme.Width) / 2;
    int y = (target.Height - centerme.Height) / 2;
    g.DrawImage(centerme, x, y);
    g.Dispose();
}
有帮助吗?

解决方案

用于更新:

  1. 设置图像的色列深入的外图像大小(ilist.ColorDepth=ColorDepth.Depth24Bit)
  2. 它列表视图并不具有可能改变标距,但是它可以轻松地完成使用Win32.你需要送的 LVM_SETICONSPACING 你的列表视图(有很多的教程如何使用图win32功能。净,因此我认为这个方向必须能够为您)。

其他提示

你可以使用的FlowLayoutPanel和降pictureboxes。设置图片框到尺寸的128×128和sizemode为'变焦'(这需要照顾的调整你的形象不失方面比)。你甚至可以通过程序加pictureboxes.

PictureBox pb = New Picturebox;
 pb.image = gcf.image128;
 FlowLayoutPanel1.Controls.Add(pb)

因为你需要有一个标签下的图片框,您可以创建一个用户控件像牧师说,所有这已经是一个图片框和标签之下。然后,这将是控制实例会增加你的flowlayoutpanel.

ObjectListView (一个开放源的包装中的一个。净列表视图)使得易于定制的绘制瓦图。看看复杂视上演示,关于图瓦当定制的绘制是启用: owner drawn tile view
(资料来源: sourceforge.net)

如果你只想要一个128×128图像,再加上一些文字的细节,你甚至不需要所有者绘制它。你可以给它一大imagelist,然后纪念这位你想要的文字信息,以显示对瓷砖,使用IsTileViewColumn.

免责声明:我的工作Atalasoft

有一个图像缩图控制我们。净像SDK, DotImage

做一个自定义控制不会太糟糕了。我将继承自小组或一个用户控件,因为我认为这两种自动增加滚动条的内容。

动态增加的容器(如PictureBoxes)和标题为每个图像处理mousedown或可事件的容器也许画一个红色的方在它的周围,以显示它选择。"最难"的一部分,将重新采样的图像,以128×128如果他们已经不是那个大小,甚至可以很容易地与GDI+。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top