Стиль вырезания элемента списка в .NET?

Как мне получить эквивалент стиля LVIS_CUT для элемента списка? Похоже, что это не выставлено структурой? Должен ли IP / Invoke?

Редактировать: LVIS_CUT - это стиль Win32, который влияет на внешний вид элемента: он отображает изображение элемента. Вы можете увидеть это в действии в проводнике Windows: выберите файл и введите Ctrl + X.

ТИА.

15.12.2008 17:00:40
3 ОТВЕТА

Вы имеете в виду, когда он неактивен? Например, когда вы делаете «разрез» на это? Если это так, я бы просто установил передний цвет на Неактивный или что-то в этом роде. Не уверен, что тебе нужно зацепиться за что-то подобное.

0
15.12.2008 17:09:38
Да. Но это также серое изображение предмета. У вас есть простое решение для этого?
Serge Wautier 15.12.2008 19:11:37

Ну, один из способов «достижения эквивалента стиля 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
10.02.2009 18:44:37

Я использовал это для моего приложения File Explorer.

    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);
        }
    }
0
1.02.2012 15:46:17