我的代码:
Private Sub ComboBox2_DrawItem(sender As Object, e As DrawItemEventArgs) Handles ComboBox2.DrawItem
If e.Index < 0 Then
Return
End If
e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
Dim CB As ComboBox = TryCast(sender, ComboBox)
If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
e.Graphics.FillRectangle(New SolidBrush(Color.DarkRed), e.Bounds)
Else
e.Graphics.FillRectangle(New SolidBrush(CB.BackColor), e.Bounds)
End If
e.Graphics.DrawString(CB.Items(e.Index).ToString(), e.Font, New SolidBrush(CB.ForeColor), New Point(e.Bounds.X, e.Bounds.Y))
End Sub
结果(注意蓝色边缘,我想更改的内容):
1条答案
按热度按时间oxosxuxt1#
要更改ComboBox下拉列表得Theme边框颜色,需要处理List Control得WM_NCPAINT消息,当需要绘制非工作区时,该消息会发送到Window得句柄:通常是在显示DropDown时。
若要取得ComboBox之List Control的控制代码,您可以使用GetComboBoxInfo()函数:其列表控件和编辑控件的句柄以COMBOBOXINFO结构返回。
然后,您可以将列表控件句柄分配给NativeWindow,以便覆盖其WndProc并捕获
WM_NCPAINT
。收到消息后,使用GetWindowDc()函数获取List Control的Device Context(
HDC
)的句柄,并将其传递给Graphics.FromHdc()方法,以创建可用于在此图面上绘制的Graphics对象。▶阅读有关
WM_NCPAINT
消息的文档,您可能会注意到WPARAM
应该引用更新区域句柄:但通常是IntPtr.0,这就是为什么我们需要GetWindowDc()
.释放设备上下文的句柄调用ReleaseDC()之后(重要)。
差不多就是这样。
自定义ComboBox控件公开一个公共**
ListBorderColor
**属性,该属性用于在设计时和运行时设置List控件边框的颜色。