MessageMap zur Laufzeit Konfigurierbar.



  • Hallo,

    ich habe eine Basisklasse geschrieben um verscheidene Controls anzuzeigen. Diese Klasse beinhaltet eine MessageMap -
    (Ganau gesagt:
    EGIN_EVENTSINK_MAP(CProcCtrlView, CAWMFormView)
    ON_EVENT_RANGE(CProcCtrlView, IDFirst, IDLast,
    ispidNotifyKeyFunction, OnKeyFunction, VTS_I4 VTS_I4 VTS_I4 VTS_BOOL)
    END_EVENTSINK_MAP())

    um auf z.B. Irgendein Event zu reagieren.
    Jetzt habe ich aber das Problem das die Parent Klassen diese MessageMap mit der IDFirst und IDLast kofigurieren müssen, da sie verschieden sind.

    Habe ich da eine Chance dieses von der Parant Klasse zu Konfiguriren?


  • Mod

    Das ist ein Event Handler für COM-Events und keine Message-Map.

    Wie willst Du wissen welches Event gesendet wird? Wenn Du den Sender nicht kennst?



  • Ja das ist schon Richtig. Es ist Event Handler für ActiveX oder Com wie du schon sagtest.

    Ich stellte Fest dass der Event Handler zur Kompilierzeit festgelegt werden muss. Und zwar die "dispid" muss bekannt sein.
    Das würde ich auch tun wollen nur weiss nicht genau wie der Event Handler in der Basisklasse umdefiniert werden kann.
    Ich möchte sozusagen den "dispid" aus der Klasse vorbelegen die die Basisklasse ableitet.

    In etwa:

    Class CMyBasis
    Implementierung :
    ...
    ON_EVENT_RANGE(CMyBasis, IDFirst, IDLast, 1, OnTest, VTS_BOOL)
    ...

    Class CMy1Class: public CMyBasis
    #define IDFirst 100
    #define IDLast 200

    Class CMy2Class: public CMyBasis
    #define IDFirst 200
    #define IDLast 300

    Aber das geht natürlich nicht. Aber vielleicht doch etwas anderes ohne dass ich den Event Handler in die Ableitungsklassen CMy1Class, CMy2Class nehmen muss.


  • Mod

    Und wieso soll das nicht gehen. Nimm keine #defines sonsdern die echten Zahlen oder const Deklarationen.

    das ist doch nur ein Makro der hier feste Zahlen benutzt!



  • Sorry, verstehe deine Antwort nicht ganz. 😕

    CMyBasis kennt die CMy1Class und CMy2Class nicht.
    Die EVENTSINK_MAP oder MESSAGE_MAP sind als constante Entries definiert.


  • Mod

    Ich verstehe Dein Problem nicht. CMyBasis muss doch auch CMy1Class1 und CMyClass2 nicht kennen.

    In CMyClass1 und 2 muss man eine eigene Event Map anlegen... genauso wie das bei Fenstern auch wäre.



  • Das ist es doch. In CMy1Class1 und CMyClass2 muss ich die EVENTSINK_MAP von der CMyBasis wegnehmen un in die beiden CMy1Class1 und CMyClass2 Klassen einfügen.

    Das würde ich aber gerne nicht tun denn die Klassen CMy1Class1 und CMyClass2 nur die CMyBasis konfigurieren sollen. Also dachte ich mir das ich die EVENTSINK_MAP in der Basis Klasse impelemntiere und über die CMy1Class1 und CMyClass2 konfiguriere.


  • Mod

    Aber die Sinkmap gehört doch zu den Unterobjekten nicht zu der Basis. Du willst Doch dass die Funktion der abgeleiteten Klasse ausgeführt wird.



  • Ja, die Funktion selbst soll in der Basis aufgerufen werden. Wobei das nicht das Problem darstellt.
    Ich möchte einfach vermeiden dass die Implementierung des EventHandler in der Klassen CMy1Class1 und CMyClass2 definiert werden muss.
    Schlisslich ist es bei beiden der gleiche EventHandler nur mit anderen CtrlIDs also kann es "theroretisch" NUR in der Basis Klasse Implementiert werden. Müsste aber "NUR" bei den Klassen CMy1Class1 und CMyClass2 die Bereiche der CtrlIDs der Basis Klasse bekannt gegeben werden.
    Aber wie wenn der EventHandler nur defines "static const" erwartet. Ausserdem ist es ohne weiteres nicht möglich die Bereiche einer CMy1Class1 oder CMyClass2 der Basis bekannt zu geben.


  • Mod

    Da die Maps statisch sind, musst Du es dort implementieren wo es benötigt wird.

    Einzige Umweg Du implementiert Den Event-Sink selber ohne Hilfe der Maps.



  • Verstehe.
    Danke.


  • Mod

    Schau Dir mal den Callstack an wer eigentlich in der Kette Diese Map nutzt.

    Evtl. ist das eine virtuelle Funktion, die Du überschreiben kannst...
    IMHO sind aber die ganzen OnEvent Funktionen nicht virtuell.

    Anderer Ansatz wäre Du änderst die Implementierung von GetEventSinkMap..., aber auch hiermusst Du ja eine reale Map liefern!

    BTW: Du kanst doch die OnTest Funktion in der Basis definieren, aber die Map Funktionen in den Kindklassen lassen...


Anmelden zum Antworten