Reputation: 369
I'm trying make custom component ComboBox but display Black color when dropdownstyle set to dropdown in vb.net
without using WndProc how can I solve it when dropdownstyle set to dropdown ?. Is there any trick or other solution ?
Please Guide me
Thanks
Imports System.ComponentModel
Imports System.Drawing.Drawing2D
Public Class FLATCOMBOBOX
Inherits ComboBox
' Fields
Private _disabledIndicatorColor As Color = Color.DarkGray
Private _disabledColor As Color = Color.FromArgb(240, 240, 240)
Private _disabledForeColor As Color = Color.FromArgb(&H6D, &H6D, &H6D)
Private _disabledBorderColor As Color = Color.FromArgb(&HCC, &HCC, &HCC)
Private _itemTopMargin As Integer = 1
Private _textLeftMargin As Integer = 5
Private _borderColor As Color = Color.Red
Private _backColor As Color = Color.White
Private _radius As Integer = 1
Private _borderthickness As BorderThickness
Private _indicatorColor As Color = Color.Red
' Methods
Public Sub New()
Me.InitializeComponent()
MyBase.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
MyBase.SetStyle(ControlStyles.ContainerControl, True)
MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
MyBase.SetStyle(ControlStyles.ResizeRedraw, True)
MyBase.SetStyle(ControlStyles.Selectable, True)
MyBase.SetStyle(ControlStyles.UserPaint, True)
MyBase.SetStyle(ControlStyles.Selectable, True)
MyBase.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
Me.FlatStyle = FlatStyle.Flat
Me.DrawMode = DrawMode.Normal
Me.DropDownStyle = ComboBoxStyle.DropDown
Me.Width = 260
Me.Height = &H20
Me.ItemHeight = &H1A
Me.DrawMode = DrawMode.OwnerDrawFixed
Me.IndicatorColor = Color.Red
Me.DropdownBorderThickness = BorderThickness.Thin
End Sub
Private Sub DrawIndicator(ByVal graphics As Graphics, ByVal lineColor As Color, ByVal indicatorColor As Color, ByVal foreColor As Color)
Dim num As Integer
Dim pen As Pen
graphics.SmoothingMode = SmoothingMode.AntiAlias
graphics.SmoothingMode = SmoothingMode.HighQuality
graphics.InterpolationMode = InterpolationMode.High
Dim brush As New SolidBrush(Me._borderColor)
Dim brush2 As New SolidBrush(Me._backColor)
If Not Me.Enabled Then
indicatorColor = Me._disabledIndicatorColor
brush.Color = Me._disabledBorderColor
brush2.Color = Me._disabledColor
End If
If Me.DropdownBorderThickness = BorderThickness.Thick Then
pen = New Pen(brush, 2.0F)
num = 1
Else
pen = New Pen(brush, 1.0F)
num = 0
End If
Using p = New Pen(Me.BorderColor, 2)
graphics.DrawRectangle(p, MyBase.ClientRectangle.X, MyBase.ClientRectangle.Y, MyBase.ClientRectangle.Width - 1, MyBase.ClientRectangle.Height - 1)
End Using
brush.Dispose()
brush2.Dispose()
pen.Dispose()
End Sub
<Category("Tools"), Description("Sets dropdown's border color.")>
Public Overridable Property BorderColor As Color
Get
Return Me._borderColor
End Get
Set(ByVal value As Color)
Me._borderColor = value
Me.Refresh()
End Set
End Property
<DisplayName("BackColor"), Category("Tools"), Description("Sets the dropdown's background color.")>
Public Overridable Property BackgroundColor As Color
Get
Return Me._backColor
End Get
Set(ByVal value As Color)
Me._backColor = value
Me.Refresh()
End Set
End Property
<Category("Tools"), Description("Sets the dropdown's border thickness.")>
Public Overridable Property DropdownBorderThickness As BorderThickness
Get
Return Me._borderthickness
End Get
Set(ByVal value As BorderThickness)
Me._borderthickness = value
Me.Refresh()
End Set
End Property
<Category("Tools"), Description("Sets the indicator color.")>
Public Overridable Property IndicatorColor As Color
Get
Return Me._indicatorColor
End Get
Set(ByVal value As Color)
Me._indicatorColor = value
Me.Refresh()
End Set
End Property
<Browsable(False)>
Public Overridable Property Color As Color
Get
Return Me._borderColor
End Get
Set(ByVal value As Color)
Me._borderColor = value
Me.Refresh()
End Set
End Property
Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs)
If Me.Enabled Then
Me.DrawIndicator(pe.Graphics, Me.Color, Me.IndicatorColor, Me.ForeColor)
Else
Me.DrawIndicator(pe.Graphics, Me._disabledBorderColor, Me._disabledBorderColor, Me._disabledForeColor)
End If
MyBase.OnPaint(pe)
End Sub
Public Enum BorderThickness
Thick
Thin
End Enum
End Class
result from code
RESULT COMBOX DROPDOWN STYLE DROPDOWNLIST
RESULT COMBOX DROPDOWNSTYLE TO DROPDOWN
Upvotes: 0
Views: 101