Créer une interface utilisateur de classe personnalisée dans VBA

0

Dans VBA, un objet UserForm est simplement une classe personnalisée (avec certains événements et propriétés) et une interface utilisateur intégrée. Moi aussi, j'aimerais créer une classe personnalisée avec une interface utilisateur intégrée, mais ce n'est pas la même que celle utilisée par userforms.

Par exemple, supposons que je souhaite créer une interface utilisateur pour calculatrice. J'aurai besoin d'éléments d'image pour l'arrière-plan de la calculatrice et les boutons, d'une zone de texte pour l'écran, puis de certains éléments pour écouter les clics de l'utilisateur. Je les lie ensuite d’une manière ou d’une autre à une classe qui contient tous les écouteurs d’événement et le code d’initialisation / fermeture pour faire apparaître l’interface graphique.

Ma question est de savoir par où commencer si je veux concevoir quelque chose comme ça?

Méthode

Une façon dont je peux penser est la suivante (dans Excel):

  • Concevoir le look de l'interface dans un éditeur d'image
  • Exportez les différents éléments sous forme de fichiers image individuels et enregistrez-les dans un emplacement / sur une feuille de calcul masquée
  • Créez une classe dans VBA qui a du code pour assembler les différents éléments d'image, c'est-à-dire pour les placer dans un emplacement prédéterminé les uns par rapport aux autres
  • Cobblez ensemble les éléments interactifs restants (boutons, zone de texte de sortie, etc.) à l'aide de contrôles activeX, qui sont invisibles et positionnés sur leurs éléments d'image respectifs.
  • Initialiser ces contrôles avec les écouteurs d'événements de ma classe

Que je peux relativement facilement faire. Mais il a les principales limitations suivantes auxquelles je peux penser:

Problèmes*

  1. En termes d'événements, je suis contraint à tout ce que le contrôle activeX a par défaut

Du fait que mon approche construit l'interface à partir d'éléments d'image, du point de vue de VBA , il s'agirait d' Shapeobjets (pour prendre en charge la transparence - bords arrondis -, car les contrôles d'image activeX ne le prennent pas en charge). Celles-ci ne déclenchent aucun événement. Par conséquent, si je veux détecter, par exemple, lorsque l'utilisateur survole le cadre de la calculatrice, je le recouvrirai avec des étiquettes invisible ActiveX ou passerai des appels d'API pour voir ce que fait la souris. Le premier est irréalisable pour les formes complexes, le dernier ajoute une charge supplémentaire de complexité supplémentaire. Dans l’idéal, je voudrais pouvoir spécifier quels éléments soulèvent quels événements à partir d’une liste de ceux qui m’ont été proposés.

  1. Redimensionnement / conception en cours d'exécution

Si mon interface est construite à partir d'éléments d'image, je ne peux pas modifier facilement la conception au moment de l'exécution. Si, disons, je veux redimensionner l'élément frame de mon interface graphique, les images au format raster standard (png, jpeg, etc.) deviendront floues, les images vectorielles (pour lesquelles Excel ne prend plus en charge actuellement) n'ont pas par défaut les règles suivantes: If the frame height is changed, stretch the sides but do not stretch the toolbar at the top. Je souhaite également prendre en charge le changement de couleur des éléments, mais il est très difficile d’utiliser des images. recolorC’est une option, mais uniquement disponible pour MSPublisher.

  1. Mémoire / taille de fichier

La majorité des éléments graphiques de mon interface seraient probablement des conceptions assez simples. De plus, cela se prête mieux à un format d’image vectorielle qu’à un format raster, mais les contrôles activeX ne la prennent pas en charge en tant qu’arrière-plan. Donc, la taille du fichier augmente, et probablement un certain retard a été introduit, par rapport à un simple bouton ajouté à un formulaire utilisateur.

* nb ceux-ci ne sont que pour le contexte, donc peut être ignoré si vous le souhaitez, ou je peux élaborer davantage sur eux si besoin est

Conclusion

Je ne veux pas utiliser les userforms car ils ont déjà une partie de l'interface définie de manière concrète - le cadre, la forme rectangulaire, les écouteurs d'événements spécifiques pour des éléments spécifiques. Je pourrais éventuellement concevoir ce que je veux dans un userform, mais je voudrais une toile vierge en termes d’apparence. Je suis sûr qu'il doit exister un meilleur moyen de concevoir des interfaces personnalisées pouvant être contrôlées avec la classe VBA, comme le ferait un utilisateur.

J'ai une vague idée que Visual Studio pourrait être utile, mais je ne sais même pas quels tutoriels rechercher. Je ne peux trouver que des instructions sur Windows Forms (ce que je ne veux pas pour les mêmes raisons que je ne veux pas de userform), ou sur les compléments Excel (qui interagissent avec Excel mais ne semblent pas avoir leur propre interface personnalisable ). Ce n'est pas vraiment ce que je recherche, alors je pense que je dois commencer par un être humain pour comprendre le problème et me diriger dans la bonne direction.

Greedo
la source
C'est hors sujet pour plusieurs raisons. Désolé
Dave
@ Dave ce que je pensais, il ne faisait pas partie de parce que ce n'est pas une question de programmation spécifique, je pensais qu'il valait mieux pour SuperUser parce qu'il est au sujet du logiciel, mais je peux voir pourquoi il pourrait être hors sujet. Des suggestions pour un meilleur endroit pour poster? Je suis à un niveau de compréhension où je ne sais même pas quoi chercher pour commencer!
Greedo
Cela semble trop large, peut-être réduire cela en une simple question et poster sur SO. Choisissez un endroit pour commencer et faites des pas un par un. Vous avez écrit toute une histoire ici, donc je suggérerais de simplifier votre question et de la diviser en plusieurs petites questions plus synthétiques. Google et YouTube sont vos amis et lorsque vous effectuez des recherches et que vous abordez un aspect de la question, d’autres aspects devraient gagner en clarté. Cela vous aidera à approfondir vos recherches ou à expliquer votre question plus clairement.
Pimp Juice IT