如何为listview项目实现LVIS_CUT样式的等效?看起来它没有被框架暴露?我应该P / Invoke吗?
编辑:LVIS_CUT是一种影响项目外观的Win32样式:它会使项目图像变灰。您可以在Windows资源管理器中看到它的运行情况:选择一个文件并键入Ctrl + X。
TIA。
答案 0 :(得分:1)
嗯,“实现相当于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控件的子类版本中。
答案 1 :(得分:0)
你是指它什么时候变灰了?就像你对它进行“切割”一样?如果是这样,我只是将forecolor设置为Inactive或沿着这些线的东西。不确定你是否需要为这样的东西进行pinvoke。
答案 2 :(得分:0)
我将它用于我的文件资源管理器应用程序..
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);
}
}