0

我有一个派生类ComboBox并覆盖了OnDrawItem自定义绘制下拉列表项。如何使组合框的编辑部分(关闭下拉菜单时显示的部分或打开下拉菜单时显示在顶部的部分)继续以默认ComboBox工作方式绘制?是否有某种方法可以调用基本ComboBox功能来绘制编辑区域部分,或者在 OwnerDraw 模式下不可用?如果不可用,如何模拟DropDownDropDownList样式的编辑区域部分的外观?

4

2 回答 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

这个问题实际上涉及两个问题。

  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
    
  2. OwnerDraw 模式不会应用系统正在使用的任何视觉样式主题,例如在按钮面上显示下拉箭头,在 DropDownList 样式中将编辑区域更改为具有按钮面等。所有这些都必须由提交 OnPaint 事件处理程序。 这个问题意味着 .NET 框架中没有现成的方法调用来使用组合框视觉样式,但可能有解决方法,或者您可以手动编程样式的实现。

于 2013-03-27T14:36:33.867 回答