Comment personnaliser un ComboBox (OwnerDrawFixed) regarde en 3D comme la norme de zone de liste déroulante?

Je fais un custom zone de liste déroulante, hérité de Winforms standard de zone de liste déroulante. Pour ma coutume zone de liste déroulante, j'ai mis DrawMode à OwnerDrawFixed et DropDownStyle à DropDownList. Puis-je écrire mon propre OnDrawItem méthode. Mais j'ai fini comme ça:

Comment personnaliser un ComboBox (OwnerDrawFixed) regarde en 3D comme la norme de zone de liste déroulante?

Comment puis-je faire de ma zone de liste déroulante Personnalisée pour ressembler à la Norme?


Mise À Jour 1: ButtonRenderer

Après avoir cherché partout, j'ai trouvé le ButtonRenderer de la classe. Il fournit un DrawButton statique/méthode partagée qui, comme son nom l'indique -- attire le bon bouton 3D. Je suis en train d'expérimenter avec elle maintenant.


Mise à jour 2: Ce qui remplace mon contrôle?

J'ai essayé en utilisant le Graphique des propriétés de divers objets que je pense, mais j'ai toujours l'échec. Enfin, j'ai essayé le Graphique de la forme, et, apparemment, quelque chose d'écrasement de mon bouton.

Voici le code:

Protected Overrides Sub OnDrawItem(ByVal e As System.Windows.Forms.DrawItemEventArgs)
  Dim TextToDraw As String = _DefaultText
  __Brush_Window.Color = Color.FromKnownColor(KnownColor.Window)
  __Brush_Disabled.Color = Color.FromKnownColor(KnownColor.GrayText)
  __Brush_Enabled.Color = Color.FromKnownColor(KnownColor.WindowText)
  If e.Index >= 0 Then
    TextToDraw = _DataSource.ItemText(e.Index)
  End If
  If TextToDraw.StartsWith("---") Then TextToDraw = StrDup(3, ChrW(&H2500)) ' U+2500 is "Box Drawing Light Horizontal"
  If (e.State And DrawItemState.ComboBoxEdit) > 0 Then
    'ButtonRenderer.DrawButton(e.Graphics, e.Bounds, VisualStyles.PushButtonState.Default)
  Else
    e.DrawBackground()
  End If
  With e
    If _IsEnabled(.Index) Then
      .Graphics.DrawString(TextToDraw, Me.Font, __Brush_Enabled, .Bounds.X, .Bounds.Y)
    Else
      '.Graphics.FillRectangle(__Brush_Window, .Bounds)
      .Graphics.DrawString(TextToDraw, Me.Font, __Brush_Disabled, .Bounds.X, .Bounds.Y)
    End If
  End With
  TextToDraw = Nothing
  ButtonRenderer.DrawButton(Me.Parent.CreateGraphics, Me.ClientRectangle, VisualStyles.PushButtonState.Default)

  'MyBase.OnDrawItem(e)
End Sub

Et voici le résultat:

Comment personnaliser un ComboBox (OwnerDrawFixed) regarde en 3D comme la norme de zone de liste déroulante?

Remplacement Me.Parent.CreateGraphics avec e.Graphics m'a ceci:

Comment personnaliser un ComboBox (OwnerDrawFixed) regarde en 3D comme la norme de zone de liste déroulante?

Et de faire le ci-dessus + le remplacement de Me.ClientRectangle avec e.Bounds m'a ceci:

Comment personnaliser un ComboBox (OwnerDrawFixed) regarde en 3D comme la norme de zone de liste déroulante?

Quelqu'un peut-il m'indiquer dont les Graphiques je dois utiliser pour la ButtonRenderer.DrawButton méthode?

PS: Le bleuté de la frontière est à cause de mon aide PushButtonState.Par défaut au lieu de PushButtonState.Normal


J'Ai Trouvé Une Réponse! (voir ci-dessous)

Je pense que vous avez le droit de graphiques (e.Les graphiques). Lors d'un rapide coup d'œil, je suppose que e.Limites n'est pas de vous donner l'ensemble des limites de la zone de liste déroulante, mais juste les limites de la zone de texte et c'est pourquoi vous obtenez une petite touche dessinée.
problème est, e.Graphique a un Clip qui est En lecture seule. Je suis toujours à la chasse de la manifestation/de code qui dessine le rectangle blanc avec flèche de menu déroulant
J'ai essayé de M'utiliser.CreateGraphics la place de l'e.CreateGraphics, qui devrait vous donner le graphisme de la zone de liste déroulante au lieu de seulement les Éléments de la zone. Il n'a pas complètement le travail, mais ce que j'ai remarqué est que la bonne case a été tiré quand j'ai cliqué sur la zone de liste déroulante, mais puis a été immédiatement retiré lorsque les éléments ont été affichés. Ainsi, le suivant vous donne la bonne case si vous pouvez comprendre comment le faire pour y rester (sans doute besoin d'être dans un autre événement qui peint la zone de liste déroulante lui-même). ButtonRenderer.DrawButton(Me.Les Graphismes, Moi.Limites, VisualStyles.PushButtonState.Normal)
ouais, été à la chasse pour cet événement toute la journée 🙁 ... eh bien, je vais juste dire à mon client "ne Peut pas être fait" 🙂 Merci pour votre aide!
Pourquoi, Microsoft?????

OriginalL'auteur pepoluan | 2011-05-03