listview项目在.NET中切割样式?

时间:2008-12-15 17:00:40

标签: c# .net winforms listview

如何为listview项目实现LVIS_CUT样式的等效?看起来它没有被框架暴露?我应该P / Invoke吗?

编辑:LVIS_CUT是一种影响项目外观的Win32样式:它会使项目图像变灰。您可以在Windows资源管理器中看到它的运行情况:选择一个文件并键入Ctrl + X。

TIA。

3 个答案:

答案 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);
        }
    }