如何向ListView添加投影?

时间:2015-02-14 06:45:54

标签: c# .net winforms visual-studio

我是否可以在不使用第三方组件的情况下在C#(view = LargeIcon模式)中为ListView项添加投影?

我能想到的唯一方法是在图像上绘制阴影,但这样当我点击图像时,阴影也会突出显示(因为它是图像的一部分!)。那么也许有一种方法可以让ListView在点击某个项目时只突出显示图像的特定区域?

1 个答案:

答案 0 :(得分:0)

最简单的方法是创建合适的drophadow位图并使用OwnerDrawing ListView个项目。

以下是一个例子:

public Form1()
{
    InitializeComponent();

    shadow = (Bitmap)Image.FromFile(aDropShadowBitmap);
    overlay = new Bitmap(64, 64);
    using (Graphics G = Graphics.FromImage(overlay))
            G.Clear(Color.FromArgb(127, 31, 191, 255));
}

Bitmap shadow;
Bitmap overlay;

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
    ListViewItem item = e.Item;
    Point bLoc = new Point(e.Bounds.X + 35, e.Bounds.Y + 10);
    Size imgS = imageList1.ImageSize;

    e.Graphics.DrawImage(shadow, bLoc);
    e.Graphics.DrawImage(imageList1.Images[e.ItemIndex], bLoc);

    if ((e.State & ListViewItemStates.Selected) == ListViewItemStates.Selected)
    {
        e.Graphics.DrawImage(overlay, bLoc);
    }
    else  {  }

    e.Graphics.DrawString(item.Text, listView1.Font, Brushes.Black,
                bLoc.X, bLoc.Y + imgS.Height + 10);
}

它使用Images中的64x64 ImageList和带阴影的合适80x80位图(在Photoshop中创建):

aDropShadowBitmap

为了显示选择,我用半透明Bitmap overlay覆盖图像。结果如下:

aListViewWithShadows

注意:原样,结果有一个微妙的错误:点击文字不会选择项目。补救措施是一个简单的解决方法..:

ItemHeight无法直接设置。相反,它源自已分配和适用ImageLists的最大高度:此处LargeImageListStateImageList

除非我们想要为所有图片添加额外的透明像素,否则我们可以通过添加第ImageListImageSize 1x100来扩大项目的有效高度,并将其指定为{{1} }。 Ne需要添加实际的StateImageList!现在项目文本也将选择项目..!