Membres inscrits :2359
Membres en ligne : 0 Invités en ligne : 7 |
Bonjour à tous.
Voici une méthode simple, mais efficace, pour créer de nouveaux types d'événements. Cette méthode ne permet pas de "transporter" des données par l'intermédiaire de ce nouveau type d'événement. Par exemple, une classe dérivée de wxThread va pouvoir informer le thread principal (celui gérant l'interface) qu'il a commencé à travailler, qu'il a fini, ... Si vous créez une nouvelle classe de bouton révolutionnaire, vous allez pouvoir créer un nouveau type comme le wxEVT_COMMAND_BUTTON_CLICKED pour les wxButtons classiques.
Tout d'abord, la théorie :
- Il faut créer un nouvel ID pour pouvoir identifier notre type d'événement par rapport aux autres, et il faut bien entendu que cet ID soit unique, pour éviter les éventuelles confusions. wxWidgets possède pour cela une fonction ( wxNewEventType() ) qui permet de le faire automatiquement. - Nous n'aurons pas besoin de créer une nouvelle classe d'événement : le wxCommandEvent suffira amplement. - Nous pourrons par contre créer la macro permettant d'utiliser notre nouveau type dans une table d'événements classique (c'est à dire comprise entre les macros BEGIN_EVENT_TABLE() et END_EVENT_TABLE() ). Voici le code à placer dans le fichier header de votre wxThread ou de votre bouton révolutionnaire (les noms ne sont bien entendu que des exemples): Code wxWidgets:
Il est à noter que les deux macros définies ci-dessus ne sont pas obligatoires. Vous n'en n'aurez pas besoin si vous utilisez la connexion dynamique d'événements grâce à la méthode wxEventHandler::Connect(). Et voici maintenant le code à placer dans le fichier source du wxThread ou du nouveau bouton : il s'agit tout simplement de la définition des nouveaux types d'événements. Code wxWidgets:// Définition des nouveaux types d'événements Et c'est tout. Voyons maintenant comment utiliser ces nouveaux types d'événements. Admettons que l'on veuille connecter tous les démarrages de notre classe dérivée de wxThread à une même méthode événementielle de notre wxFrame, et que l'on veuille connecter les "fins de travaux" de deux wxThreads différents ayant les identifiants ID_THREAD1 et ID_THREAD2. Tout d'abord, l'utilisation "classique" d'une table d'événements : Code wxWidgets:BEGIN_EVENT_TABLE( MyFrame, wxFrame) Maintenant, l'utilisation de la connexion dynamique : les méthodes événementielles correspondent exactement à celles indiquées ci-dessus. Seule la méthode de connexion change. Code wxWidgets:// Placez par exemple les lignes suivantes dans le constructeur de la fenêtre Voyons maintenant comment "envoyer" un événement depuis notre wxThread. Dans cet exemple, un pointeur vers la fenêtre "parente" est passé au wxThread qui le stocke dans une variable wxWindow* m_parent. Code wxWidgets:// La fonction appelée lorsque l'on fait un wxThread::Run() Le thread devra bien entendu avoir été créé avec l'identifiant ID_THREAD1 ou ID_THREAD2 pour que l'événement de fin de travail soit intercepté correctement.
Voilà , c'est tout pour cette méthode.
Je le répète, elle ne permet pas de "transférer" des données par l'intermédiaire de l'événement. Pour cela, il va falloir créer notre propre classe (dérivée de wxCommandEvent) afin de pouvoir lui passer des données avant de poster l'événement. Mais cela sera le sujet d'un autre snippet. Bonne prog, et @+ Xav'
|