Я делаю собственный ComboBox, унаследованный от стандартного ComboBox Winforms. Для своего настраиваемого ComboBox я установил DrawMode
на OwnerDrawFixed
и DropDownStyle
на DropDownList
. Затем я пишу свой собственный метод OnDrawItem
. Но в итоге я получил следующее:
Как сделать мой Custom ComboBox похожим на стандартный?
После поиска я нашел класс ButtonRenderer
. Он предоставляет статический / общий метод DrawButton
, который, как следует из названия, рисует правильную трехмерную кнопку. Сейчас я экспериментирую с этим.
Я пробовал использовать свойства 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
И вот результат:
Замена Me.Parent.CreateGraphics
на e.Graphics
получил мне это:
И проделав все вышеизложенное + заменив Me.ClientRectangle
на e.Bounds
получил следующее:
Может ли кто-нибудь указать мне , чью графику я должен использовать для метода ButtonRenderer.DrawButton
?
PS: Голубоватая граница связана с тем, что я использовал PushButtonState.Default вместо PushButtonState .Normal