Как сделать так, чтобы пользовательский ComboBox (OwnerDrawFixed) выглядел в 3D, как стандартный ComboBox?

Я делаю собственный ComboBox, унаследованный от стандартного ComboBox Winforms. Для своего настраиваемого ComboBox я установил DrawMode на OwnerDrawFixed и DropDownStyle на DropDownList . Затем я пишу свой собственный метод OnDrawItem . Но в итоге я получил следующее:

Standard vs Custom ComboBoxes

Как сделать мой Custom ComboBox похожим на стандартный?


Обновление 1: ButtonRenderer

После поиска я нашел класс ButtonRenderer . Он предоставляет статический / общий метод DrawButton , который, как следует из названия, рисует правильную трехмерную кнопку. Сейчас я экспериментирую с этим.


Обновление 2: Что перезаписывает мой элемент управления?

Я пробовал использовать свойства Graphics различных объектов, о которых я могу думать, но всегда терпел неудачу. Наконец, я попробовал Графика формы, и, видимо, что-то перезаписывает мою кнопку.

Вот код:

Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
  Dim TextToDraw As String = _DefaultText
  __Brush_Window.Color = Color.FromKnownColor(KnownColor.Window)
  __Brush_Disabled.Color = Color.FromKnownColor(KnownColor.GrayText)
  __Brush_Enabled.Color = Color.FromKnownColor(KnownColor.WindowText)
  If e.Index >= 0 Then
    TextToDraw = _DataSource.ItemText(e.Index)
  End If
  If TextToDraw.StartsWith("---") Then TextToDraw = StrDup(3, ChrW(&H2500)) ' U+2500 is "Box Drawing Light Horizontal"
  If (e.State And DrawItemState.ComboBoxEdit) > 0 Then
    'ButtonRenderer.DrawButton(e.Graphics, e.Bounds, VisualStyles.PushButtonState.Default)
  Else
    e.DrawBackground()
  End If
  With e
    If _IsEnabled(.Index) Then
      .Graphics.DrawString(TextToDraw, Me.Font, __Brush_Enabled, .Bounds.X, .Bounds.Y)
    Else
      '.Graphics.FillRectangle(__Brush_Window, .Bounds)
      .Graphics.DrawString(TextToDraw, Me.Font, __Brush_Disabled, .Bounds.X, .Bounds.Y)
    End If
  End With
  TextToDraw = Nothing
  ButtonRenderer.DrawButton(Me.Parent.CreateGraphics, Me.ClientRectangle, VisualStyles.PushButtonState.Default)

  'MyBase.OnDrawItem(e)
End Sub

И вот результат:

Overwritten ButtonRenderer

Замена Me.Parent.CreateGraphics на e.Graphics получил мне это:

Clipped ButtonRenderer

И проделав все вышеизложенное + заменив Me.ClientRectangle на e.Bounds получил следующее:

Shrunk ButtonRenderer

Может ли кто-нибудь указать мне , чью графику я должен использовать для метода ButtonRenderer.DrawButton ?

PS: Голубоватая граница связана с тем, что я использовал PushButtonState.Default вместо PushButtonState .Normal


Я нашел ответ! (см. Ниже)

8
задан pepoluan 10 May 2011 в 05:15
поделиться