【发布时间】:2008-12-15 17:00:40
【问题描述】:
如何为列表视图项实现等效的 LVIS_CUT 样式?看起来它没有被框架公开?我应该 P/Invoke 吗?
编辑:LVIS_CUT 是一种影响项目外观的 Win32 样式:它使项目图像变灰。您可以在 Windows 资源管理器中看到它的实际效果:选择一个文件并键入 Ctrl+X。
TIA。
【问题讨论】:
如何为列表视图项实现等效的 LVIS_CUT 样式?看起来它没有被框架公开?我应该 P/Invoke 吗?
编辑:LVIS_CUT 是一种影响项目外观的 Win32 样式:它使项目图像变灰。您可以在 Windows 资源管理器中看到它的实际效果:选择一个文件并键入 Ctrl+X。
TIA。
【问题讨论】:
嗯,“实现相当于 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 控件的子类版本中。
【讨论】:
您是指它何时变灰?就像你对它进行“切割”一样?如果是这样,我只需将前景色设置为非活动或类似的东西。不确定您是否需要为类似的事情进行 pinvoke。
【讨论】:
我将它用于我的文件浏览器应用程序..
private void MakeCutItem()
{
foreach (ListViewItem item in listView1.SelectedItems)
{
Image img = item.ImageList.Images[item.ImageIndex];
Brush overlay = new SolidBrush(Color.FromArgb(128, BackColor));
Rectangle rect = new Rectangle(new Point(0, 0), item.ImageList.ImageSize);
using (Graphics g = Graphics.FromImage(img))
{
g.FillRectangle(overlay, rect);
}
item.ImageIndex = item.ImageList.Images.Add(img,Color.Empty);
}
}
【讨论】: