Bonjour à toutes et tous
Je suis en train de faire un composant WPF (un poil de C# et beaucoup de C++/CLI) qui encapsule des librairie C++.
Coté C++, nous avons un système de notification interne basé sur des callbacks. Je voudrais que ces notifications soient accessibles dans l'interface via l'envoi d'event managé classique (le but est que les utilisateurs du composant ne voient pas le code non managé)
Sauf que j'aimerais éviter d'écrire un mécanisme générique auquel on file le type de notification, la classe d'argument de l'event CLI et qu'il transforme l'un en l'autre tout seul. Et je bloque sur deux points :
- Pas le droit aux pointeurs de fonction sur une classe managée
- Pas possible de déclaré un event depuis une classe non managé
J'étais donc parti sur une classe template mais je n'arrive pas a utiliser un type d'event et/ou delegate en paramètre de template ... (ce qui me semble logique)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public ref class CkstClrKineoControl : public System::Windows::Controls::Control { public: delegate void SelectionDidChangeDelegate(CkstClrNotificationSelection^ i_selection); SelectionDidChangeDelegate^ SelectionDidChangeEvent; event SelectionDidChangeDelegate^ SelectionDidChangeEventHandler {...} // add, remove & raise private: CkstClrNotificator<CkstClrNotificationSelection, SelectionDidChangeDelegate>* m_notificator; } CkstClrKineoControl::CkstClrKineoControl() { m_notificator = new CkstClrNotificator <CkstClrNotificationSelection, SelectionDidChangeDelegate> (CkitNotificator::defaultNotificator(), CkppSelection::DID_CHANGE, SelectionDidChangeEvent); }Bon ça marche pas, mais c'est le seul truc que j'arrive à faire compiler
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 template < typename clrNotificationClass, typename eventClass > class CkstClrNotificator { public: inline CkstClrNotificator(const CkitNotificatorShPtr& i_notificator, CkitNotification::TType i_type, eventClass^ i_event): m_type(i_type), m_event(i_event) { i_notificator->subscribe< CkstClrNotificator >(m_type, this, &CkstClrNotificator::notificationReciever); } inline virtual ~CkstClrNotificator() { CkitNotificator::defaultNotificator()->unsubscribe(m_type, this); } inline void notificationReciever(const CkitNotificationConstShPtr& i_notification) { CkstClrNotificationSelection^ clrSelection = gcnew clrNotificationClass(i_notification); m_event->Invoke(clrSelection); } private: CkitNotification::TType m_type; gcroot<eventClass^> m_event; };
Donc je cherche soit a corriger cette méthode, soit une autre méthode ou je pourrais transformer mes notifications en event managé sans avoir a écrire une classe spécifique non managé et une fonction managé spécifique pour faire envoyé l'event, ceci par type de notification a envoyer
Partager