【问题标题】:listview item cut style in .NET?.NET 中的列表视图项目剪切样式?
【发布时间】:2008-12-15 17:00:40
【问题描述】:

如何为列表视图项实现等效的 LVIS_CUT 样式?看起来它没有被框架公开?我应该 P/Invoke 吗?

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

TIA。

【问题讨论】:

    标签: c# .net winforms listview


    【解决方案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 控件的子类版本中。

    【讨论】:

      【解决方案2】:

      您是指它何时变灰?就像你对它进行“切割”一样?如果是这样,我只需将前景色设置为非活动或类似的东西。不确定您是否需要为类似的事情进行 pinvoke。

      【讨论】:

      • 是的。但它也会使项目图像变灰。你有一个简单的解决方案吗?
      【解决方案3】:

      我将它用于我的文件浏览器应用程序..

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        相关资源
        最近更新 更多