我有一个派生类ComboBox
并覆盖了OnDrawItem
自定义绘制下拉列表项。如何使组合框的编辑部分(关闭下拉菜单时显示的部分或打开下拉菜单时显示在顶部的部分)继续以默认ComboBox
工作方式绘制?是否有某种方法可以调用基本ComboBox
功能来绘制编辑区域部分,或者在 OwnerDraw 模式下不可用?如果不可用,如何模拟DropDown
和DropDownList
样式的编辑区域部分的外观?
问问题
1633 次
2 回答
1
DrawItemEventArgs
传递的 as为e
您提供了一些可以使用的工具。要复制系统在OwnerDraw
模式下为您绘制的内容,您可以执行以下操作:
Public Class MyComboBox
Inherits System.Windows.Forms.ComboBox
Private _font As Font = New Font(FontFamily.GenericSansSerif, 9.0, _
FontStyle.Regular)
Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs)
e.DrawBackground()
If e.Index = -1 Then Exit Sub
e.Graphics.DrawString(Me.Items(e.Index).ToString, _font, _
System.Drawing.Brushes.Black, _
New RectangleF(e.Bounds.X, e.Bounds.Y, _
e.Bounds.Width, e.Bounds.Height))
e.DrawFocusRectangle()
End Sub
End Class
编辑 :
如果您要更改显示项目与下拉区域中绘制的项目的绘图行为,您可以根据DroppedDown
属性分支绘图代码:
e.DrawBackground()
If e.Index = -1 Then Exit Sub
If Not Me.DroppedDown Then
e.Graphics.DrawString(Me.Items(e.Index).ToString, _font,
System.Drawing.Brushes.Black, _
New RectangleF(e.Bounds.X, e.Bounds.Y, _
e.Bounds.Width, e.Bounds.Height))
Else
' do whatever you want - draw something else
Dim rectangle As Rectangle = New Rectangle(2, e.Bounds.Top + 2, _
e.Bounds.Height, e.Bounds.Height - 4)
e.Graphics.FillRectangle(Brushes.Blue, rectangle)
e.Graphics.DrawString("foo...I'm item #" & e.Index, _font, _
System.Drawing.Brushes.Black, _
New RectangleF(e.Bounds.X + rectangle.Width, _
e.Bounds.Y, e.Bounds.Width, e.Bounds.Height))
End If
e.DrawFocusRectangle()
同样,您可以基于If Me.DropDownStyle = ComboBoxStyle.DropDownList ...
等进行分支。以您喜欢的任何方式处理每个案例。如果您想要由操作系统绘制的组件提供的渐变、主题元素或其他功能,那么您必须自己绘制它们。
于 2013-03-26T16:56:55.507 回答
1
这个问题实际上涉及两个问题。
为了确定在组合框的编辑区域中显示哪些数据,请使用 OnDrawItem 事件中事件参数的 State 属性,如下所示:
Protected Overrides Sub OnDrawItem(e As DrawItemEventArgs) ' Draw the background of the item. e.DrawBackground() ' Skip doing anything else if the item doesn't exist. If e.Index = -1 Then Exit Sub If (e.State And DrawItemState.ComboBoxEdit) = DrawItemState.ComboBoxEdit Then ' Draw the contents of the edit area of the combo box. Else ' Draw the contents of an item in the drop down list. ' Draw the focus rectangle. e.DrawFocusRectangle() End If End Sub
OwnerDraw 模式不会应用系统正在使用的任何视觉样式主题,例如在按钮面上显示下拉箭头,在 DropDownList 样式中将编辑区域更改为具有按钮面等。所有这些都必须由提交 OnPaint 事件处理程序。 这个问题意味着 .NET 框架中没有现成的方法调用来使用组合框视觉样式,但可能有解决方法,或者您可以手动编程样式的实现。
于 2013-03-27T14:36:33.867 回答