我是否可以在不使用第三方组件的情况下在C#(view = LargeIcon
模式)中为ListView项添加投影?
我能想到的唯一方法是在图像上绘制阴影,但这样当我点击图像时,阴影也会突出显示(因为它是图像的一部分!)。那么也许有一种方法可以让ListView在点击某个项目时只突出显示图像的特定区域?
答案 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中创建):
为了显示选择,我用半透明Bitmap overlay
覆盖图像。结果如下:
注意:原样,结果有一个微妙的错误:点击文字不会选择项目。补救措施是一个简单的解决方法..:
ItemHeight
无法直接设置。相反,它源自已分配和适用ImageLists
的最大高度:此处LargeImageList
和StateImageList
。
除非我们想要为所有图片添加额外的透明像素,否则我们可以通过添加第ImageList
个ImageSize 1x100
来扩大项目的有效高度,并将其指定为{{1} }。 Ne需要添加实际的StateImageList
!现在项目文本也将选择项目..!