Hallo!
im Grunde genauso, wie Manfred das gezeigt hat.
Du kannst in OnDrawItem() über e.State abfragen, ob das makierte Item gezeichnet werden soll oder
nicht. Dem entspechend sollte dann der Hintergrund gezeichnet werden oder nicht
<e.DrawFocusRectangle()>
der folgende Code ist ein Ausschnitt aus einem Benutzersteuerelement von mir. Ich habe einen Ausschnitt herauskopiert (hoffe es fehlt nicht etwas wichtiges) Du müsstest dan den Code in m_ColorItem() noch entsprechend Deinen Farbvorstellungen anpassen...
In meinem Code wird vor jedem Item ein farbiges Rechteck (was beim zeichnen des Focusrechtecks beachtet wird) dargestellt. Die Größe dieses Rechtecks ist durch 'RectMargin' festgelegt. Daher die
etwas wilde Ermittlung der Größen der zu zeichnenden Rechtecke. Aber es geht ja um's Prinzip
Das kannst Du alles weglassen.
Wichtig ist, dass mMak anzeigt, wenn das Focusrechteck gezeichnet werden soll und mEditComboItem
das zeichnen des Element direkt im Combo.
Private mMak As Boolean
Private mEditComboItem As Boolean
Protected Overrides Sub OnDrawItem(ByVal e As _
System.Windows.Forms.DrawItemEventArgs)
mEditComboItem = ((e.State And DrawItemState.ComboBoxEdit) = _
DrawItemState.ComboBoxEdit)
mMak = ((e.State And DrawItemState.Focus) = DrawItemState.Focus)
If Not mMak Then e.DrawBackground()
Call m_ColorItem(e.Graphics, e.Bounds, e.Index)
If Not mMak Then e.DrawFocusRectangle()
End Sub
Private Sub m_ColorItem(ByVal ItemGraphics As Graphics, ByVal ItemRectangle As _
Rectangle, ByVal ItemIndex As Integer)
Dim ItemText As String = mSelectedColor.Name
Dim Pen As New Pen(Color.Black, 1)
Dim TextBrush As New SolidBrush(Me.ForeColor)
Dim RW As Integer = mRectWidth
Try
If ItemIndex >= 0 AndAlso ItemIndex < Items.Count Then
ItemText = Items(ItemIndex).ToString
Using ColorBrush As SolidBrush = New SolidBrush( _
Color.FromName(ItemText))
With ItemGraphics
If mMak = True AndAlso mEditComboItem = False Then
'Makierung...
TextBrush = New SolidBrush(Color.FromKnownColor( _
KnownColor.HighlightText)) 'Hier
' Focus-Rechteck zeichnen (in Standard-Farbe)
End If
'If mEditComboItem AndAlso Not mShowColorName Then
' RW = ItemRectangle.Width - RectMargin * 2
'selektierter Hintergrund...
If mMak Then
If Not mEditComboItem Then
.FillRectangle(New SolidBrush( _
Me.BackColor), ItemRectangle.Left, _
ItemRectangle.Top, CInt(RW + RectMargin * _
2 + TextMargin / 2), ItemRectangle.Height)
End If
End If
.FillRectangle(ColorBrush, ItemRectangle.Left + _
RectMargin, ItemRectangle.Top + RectMargin, RW, _
ItemRectangle.Height - 4)
.DrawRectangle(Pen, New Rectangle( _
ItemRectangle.Left + RectMargin - 1, _
ItemRectangle.Top + RectMargin - 1, RW + 1, _
ItemRectangle.Height - 3))
If mEditComboItem Then
If mShowColorName Then .DrawString(ItemText, _
Me.Font, TextBrush, ItemRectangle.Left + RW + _
RectMargin * 2 + TextMargin, _
ItemRectangle.Top + (ItemRectangle.Height - _
Me.Font.GetHeight()) / 2)
Else
.DrawString(ItemText, Me.Font, TextBrush, _
ItemRectangle.Left + RW + RectMargin * 2 + _
TextMargin, ItemRectangle.Top + ( _
ItemRectangle.Height - Me.Font.GetHeight()) / _
2) 'Hier Text schreiben...
End If
'Linie?
'If Not mEditComboItem AndAlso ItemIndex = 33 Then
'.DrawLine(Pen, ItemRectangle.Left,
' ItemRectangle.Top + ItemRectangle.Height - 1,
' ItemRectangle.Left + ItemRectangle.Width,
' ItemRectangle.Top + ItemRectangle.Height - 1)
'End If
End With
End Using
End If
Catch ex As Exception
'InfoMeldung(
' System.Reflection.MethodInfo.GetCurrentMethod.DeclaringType.N
' ame & "-" &
' System.Reflection.MethodBase.GetCurrentMethod.Name & ": " &
' ex.Message)
Finally
TextBrush.Dispose()
Pen.Dispose()
End Try
End Sub Schü |