Question

J'écris un comportement personnalisé pour un ToolStripDropDown contrôle.J'aimerais également modifier le ToolStripDropDownButton lui-même pour afficher une forme colorée.

Je vois que je peux gérer le Paint événement et dessiner ce que je veux.Cependant, existe-t-il un moyen pour que le bouton peigne l'arrière-plan par défaut avant de peindre la forme ?Il serait difficile d'obtenir un arrière-plan précis, en particulier avec les futures versions de .NET et Windows.

Dans le bon vieux Windows, je pourrais invoquer le gestionnaire de processus par défaut avant ou après mon code de peinture.Je ne vois aucun moyen d'y parvenir dans .NET.Ou peut-être existe-t-il un moyen de dire au bouton de peindre uniquement l'arrière-plan ?

Était-ce utile?

La solution

Lorsque vous manipulez le Paint événement (au lieu de remplacer le OnPaint méthode dans une classe dérivée), la classe de base (gestionnaire de procédure par défaut) est déjà appelée.Tout est dessiné normalement, et ensuite vous dessinez essentiellement en plus de ça dans le Paint événement.Vous pouvez le voir clairement ici :

     Lime rectangle drawn over part of the drop-down button, clearly showing the default contents underneath

L'astuce consiste à s'assurer que vous laissez suffisamment de rectangle de découpage du contrôle exposé à montrer la pièce que vous voulez.Le e.ClipRectangle la propriété récupère le entier la zone client du bouton, donc si vous venez de
remplissez-le avec un échantillon de couleur, vous allez également masquer la flèche déroulante et l'arrière-plan par défaut.La démonstration ci-dessus a été créée à l'aide de l'exemple de code laid suivant :

private void ToolStripDropDownButton1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(Brushes.Chartreuse,
                             e.ClipRectangle.X + 3, e.ClipRectangle.Y + 3,
                             e.ClipRectangle.Width - 12,
                             e.ClipRectangle.Height - 12);
}

En dehors de cela, je ne pense pas qu'il existe un moyen de personnaliser exactement ce qui est dessiné par la classe de base.Le dessin du propriétaire (au moins dans WinForms) a tendance à être une affaire de tout ou rien.Vous obtenez un contrôle total,
mais cela se fait au prix de devoir tout mettre en œuvre vous-même.


Bien sûr, au cas où vous ne l'auriez pas déjà remarqué, le ToolStrip contrôle déjà ne ressemble pas à un contrôle Windows natif.Et pire encore, c'est toujours va ressembler exactement à ce qu'il est maintenant,
même dans les futures versions de Windows qui refont complètement l'interface utilisateur.(Le MenuStrip est en proie à
ce même phénomène, et la différence est très visible sous Windows Vista/7 où les menus standards de l'API ont radicalement changé).La raison en est que les deux contrôles sont entièrement dessinés en code C# écrit dans leurs implémentations WinForms.Personnellement, je pense que cela a l'air ridiculement ringard et je ne l'utiliserais pas dans l'une de mes applications pour un pari.

Toi peut attribuez un moteur de rendu personnalisé qui utilise l'API UxTheme pour dessiner les boutons, qui obtiendront beaucoup plus proche de l’apparence des menus et des barres d’outils natifs.Un échantillon assez complet est disponible ici.J'ai écrit quelque chose de très similaire pour le développement WinForms que j'ai réalisé, nécessitant les fonctionnalités supplémentaires du ToolStrip classe (telle que l'intégration de zones de liste déroulante) non proposée par le
vieille école MainMenu et ToolBar contrôles qui enveloppent simplement leurs équivalents API Windows.En choisissant de procéder de cette façon, vous avez plus de contrôle sur les parties exactes du moteur de rendu de classe de base que vous souhaitez appeler, car vous avez écrit le code explicitement vous-même.Fortement recommandé si vous êtes
le type qui se soucie du tout de l’interface utilisateur, de la sensation native ou de l’expérience utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top