好吧,“实现相当于 LVIS_CUT 样式”的一种方法如下:
使用沿线的功能
private void MakeCutList(ImageList sourceList, Color background)
{
Brush overlay = new SolidBrush(Color.FromArgb(128, BackColor));
Rectangle rect = new Rectangle(new Point(0, 0), sourceList.ImageSize);
foreach (Image img in sourceList.Images)
{
Bitmap cutBmp = new Bitmap(img.Width, img.Height);
using (Graphics g = Graphics.FromImage(cutBmp))
{
g.DrawImage(img, 0, 0);
g.FillRectangle(overlay, rect);
}
sourceList.Images.Add(cutBmp);
}
}
获取 ListView 使用的图像列表(即 listView1.ImageList)并添加所有图标的“剪切”版本。您可以在表单中的 InitializeComponent 之后立即调用它,例如
public Form1()
{
InitializeComponent();
MakeCutList(listView1.LargeImageList, listView1.BackColor);
}
然后你可以使用这样的代码
private void SetCutState(ListViewItem lvi, Boolean isItemCut)
{
int originalListSize = lvi.ImageList.Images.Count / 2;
int baseIndex = lvi.ImageIndex % originalListSize;
int cutImagesOffset = originalListSize;
if (isItemCut)
{
lvi.ImageIndex = cutImagesOffset + baseIndex;
lvi.ForeColor = SystemColors.GrayText;
}
else
{
lvi.ImageIndex = baseIndex;
lvi.ForeColor = SystemColors.WindowText;
}
}
将项目的状态更改为被切割或不被切割。
一旦你得到这个工作,你可以尝试将类似的代码放入 ListView 控件的子类版本中。