Question

J'ai un contrôle personnalisé: il s'agit d'un code géré, qui sous-classe System.Windows.Forms.Control.

Je souhaite ajouter des éléments tels que des zones d'édition, des listes de sélection, des zones de liste déroulante, des boutons radio, etc., aux emplacements de ce contrôle. Pour cela, il suffit d’ajouter des occurrences de ces classes à la collection Controls afin qu’elles deviennent des contrôles enfants.

Les ajouter en tant que contrôles enfants peut créer des problèmes subtils, par exemple:

  • Contrôles de sélection IE 6 (Zone de liste déroulante) via le menu

  • J'ai des barres de défilement sur mon contrôle qui semblent faire défiler le contenu du contrôle (le contenu est plus grand que le contrôle lui-même); lorsqu'un contrôle enfant se trouve près du bord de l'écran, j'aimerais alors afficher à moitié (c.-à-d. couper) cet enfant (c.-à-d. avoir la moitié de celui-ci situé au bord de l'écran physique), mais un véritable contrôle enfant ne peut pas être situé en dehors de la frontière de son parent.

  • Existe-t-il d'autres problèmes potentiels?

Lorsque j'utilise IE7 pour afficher http://www.tizag.com/htmlT/htmlselect .php (par exemple), qui contient des listes déroulantes, etc., et lorsque j'utilise ensuite Spy ++ pour espionner IE7 lorsque je le fais, je ne vois qu'une seule instance Window / control sans enfant (dont la classe nom est "Internet Explorer_Server").

Je suppose que cela signifie que dans IE7, la fonctionnalité permettant de rendre une zone de liste déroulante est intégrée au contrôle IE7 lui-même et que IE7 n'utilise pas les contrôles standard en tant que contrôles enfants.

Questions:

  • Est-il préférable de réutiliser les contrôles standard en tant qu'enfants d'un contrôle personnalisé ou de réimplémenter la fonctionnalité des contrôles standard au sein d'un contrôle personnalisé lui-même?
  • Avez-vous des mises en garde (avertissements) à partager, liées à l'un ou l'autre scénario?
  • Si je souhaitais réimplémenter la fonctionnalité des contrôles standard dans un contrôle personnalisé, connaissez-vous un code existant (qui implémenterait cette fonctionnalité) que je pourrais réutiliser?

Si un tel code existe déjà, je ne sais pas comment le rechercher (mes recherches trouvent, par exemple, des zones de liste déroulantes dessinées par le propriétaire et des extensions de zones de liste déroulantes standard): peut-être que peu de personnes réimplémenteront les contrôles standard à partir de zéro ?

Modifier

J'ai trouvé une question semi-liée: Comment rendre un contrôle ressemblant à ComboBox avec les styles visuels activés?

Était-ce utile?

La solution

Oui, Internet Explorer dessine les contrôles à l'aide des API de thématisation Windows. Vous pouvez également le faire en utilisant les types définis dans l'espace de noms System.Windows.Forms.VisualStyles.

L’équipe IE a agi de la sorte pour éviter les problèmes de performances dus à autant de contrôles, chacun recevant des messages de fenêtre, à la fois. Par exemple, en regardant cette page StackOverflow.com, je vois 30 à 40 commandes de libellés de liens, une dizaine de boutons, plus de 20 libellés, etc.

Il convient de noter que le logiciel Zune, qui est un code géré par .NET, utilise également des contrôles personnalisés. Si vous essayez d'utiliser Spy ++ sur l'un des contrôles, vous verrez qu'ils ne sont pas de véritables contrôles Win32. Vous pouvez utiliser Reflector sur le logiciel Zune pour voir exactement ce qu’ils font. Si je me souviens bien, ils utilisent un framework d'interface utilisateur géré personnalisé inclus dans le logiciel Zune.

Pour ce qui est de réécrire ces contrôles à partir de zéro, je pense qu’il ya beaucoup de travail à faire. Cela semble plus facile que ce ne le serait vraiment.

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