Combobox нарисовать изображение на выбранном - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь нарисовать изображение из списка изображений в выпадающем списке, когда элемент выбран.

Я могу нарисовать изображение, но когда событие onSelctedIndexChanged закончилось, я потерял свое изображение.

Мой комбинированный список уже имеет DrawMode.OwnerDrawFixed

У меня есть ListImage элемент управления с именем ImageList с 10 изображениями.

Для моего короткого примера мне просто нужно нарисовать в своем комбинированном окне изображение в позиции 1 моего ImageList, это причина, почему я получаю это. ImageList.Draw (g, 0, 0, 1 ) ;

  protected override void OnSelectedIndexChanged(EventArgs e)
    {
      base.OnSelectedIndexChanged(e);

      if (this.SelectedIndex > -1)
      {
        var g = this.CreateGraphics();
        this.ImageList.Draw(g, 0, 0, 1);   

      }

    }

Возможно, я не привязан к нужному событию. Любое предложение?

См. Рисунок ниже с точкой останова в IndexChanged после розыгрыша. Это работа, но я потерял свой имидж после события.

enter image description here

1 Ответ

0 голосов
/ 30 апреля 2018

Изменить вас ComboBox DrawMode на OwnerDrawVariable.
Используйте событие DrawItem для рисования изображений из вашего источника (в данном случае ImageList) внутри элемента ComboBox Bounds.

Если ComboBox DropDownStyle установлен на DropDownList, изображение будет отображаться в поле выбора; если он установлен на DropDown, будет нарисован только текст.

Здесь прямоугольник «Фокус» рисуется только тогда, когда точка мыши наводит курсор на элементы ListControl, в то время как он не используется при выборе элемента, который определяется:
(e.State.HasFlag(DrawItemState.Focus) && !e.State.HasFlag(DrawItemState.ComboBoxEdit)).

// These could be properties used to customize the ComboBox appearance
Color cboForeColor = Color.Black;
Color cboBackColor = Color.WhiteSmoke;

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index < 0) return;
    Color foreColor = e.ForeColor;
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
    e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;

    if (e.State.HasFlag(DrawItemState.Focus) && !e.State.HasFlag(DrawItemState.ComboBoxEdit)) {
        e.DrawBackground();
        e.DrawFocusRectangle();
    }
    else {
        using (Brush backgbrush = new SolidBrush(cboBackColor)) {
            e.Graphics.FillRectangle(backgbrush, e.Bounds);
            foreColor = cboForeColor;
        }
    }
    using (Brush textbrush = new SolidBrush(foreColor)) {
        e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(),
                              e.Font, textbrush, e.Bounds.Height + 10, e.Bounds.Y,
                              StringFormat.GenericTypographic);
    }
    e.Graphics.DrawImage(this.imageList1.Images[e.Index],
                         new Rectangle(e.Bounds.Location,
                         new Size(e.Bounds.Height - 2, e.Bounds.Height - 2)));
}

Магические числа здесь (10, -2) просто смещения:
e.Bounds.Height + 10 => 10 пикселей справа от изображения.
e.Bounds.Height -2 => на 2 пикселя меньше, чем item.Bounds.Height.

ComboBox Ownerdraw with Images

...