Message_Map-Problem



  • Hallo,

    ich habe ein kleinen Problem mit einer Message_Map.
    Für die Kommunikation mit der Seriellenschnittstelle benütze ich die Klasse "SerialPort" von Remon Spekreijse. Wenn ein Byte an der Schnittstelle empfangen wird, dann wird das Event "WM_COMM_RXCHAR" gesetzt und dies wird von der Message_Map aufgefangen und das Empfangene Byte an die entsprechene Funktion weitergegeben. Dies Funktioniert auch schon sehr gut, wenn ich die Message_Map von der DLG-Klasse (MFC Dialog-Projekt) benützte.
    Wenn ich aber eine Klasse schreibe die auch von CDialog abgeleitet wird und dort eine Message_Map implementiere und in dieser neuen Klasse mir die SerialPort-Klasse initialisiere, dann wird die Message_Map NICHT ausgeführt.

    Die Klasse SerialPort bekommt am Anfang einen CWnd* Pointer übergeben mit dem ownder von der SerialPort-Klasse. Wenn ich dort beim aufruf den this-Pointer übergebe, dann wird die Message-Map leider nicht aufgerufen. Übergebe ich aber den Pointer von der DLG-Klasse, dann wird die Message-Map von der DLG-Klasse aufgerufen.

    Der Aufbau der Message-Maps ist in beiden fällen identisch.

    So.. nun meine Frage:
    Wie kann ich dafür sorgen, dass bei einem Event die Message_Map auf der neuen Klasse aufgerufen wird und nicht die message_map von der DLG-Klasse ?

    Ich hoffe, ich habe das Problem zumindest halbwegs deutlich erklärt.

    Gruß,

    Michi



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    DECLARE_MESSAGE_MAP auch in Deiner Klasse definiert?
    Hast Du auch den Klassennamen in BEGIN_MESSAGE_MAP korrekt eingetragen?



  • Hallo,

    ich habe folgendes in der Headerdatei definiert:

    afx_msg LONG OnCommunication(UINT, LONG);
    DECLARE_MESSAGE_MAP();
    

    und in der CPPdatei steht:

    BEGIN_MESSAGE_MAP(CDatahandler, CWnd)
    
    	//event handling for the serialport
    	ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)
    
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    

    Michi



  • Ich hab noch ein bisschen rumprobiert und bin auf folgendes Problem gestoßen...

    Ich habe meine Klasse von CDialog abgeleitet um eine Message_Map implementieren zu können. Wenn ich mir jetzt den this-Pointer anzeigen lasse, dann hat die Variable this->m_hWnd den Wert NULL. Wie kann ich den Wert setzen ?

    Gruß,

    Michi


  • Mod

    Dann musst Du diesen Dialog eben auch erzeugen. Eine Objekt kann nur Nachrichten empfangen wenn es erzeugt wurde. Die Map alleine ist Wirkungslos.

    DoModal, Create sinf die entsprechenden Funktionen mit denen man einen Dialog erzeugt.
    Aber ich vermute, Du hast ein ganz anderes Problem und das liegt mehr beim allgemeinen Verständnis... 🕶



  • Bis jetzt dachte ich ja immer, dass ich es verstanden habe - aber dieses Problem zeigt mir die Grenzen.

    Ich habe ein Dialog gezeichnet und dieser wir auch angezeigt. Jetzt möchte ich aber eine neue Klasse schreiben, die eine zusätzliche MessageMap beinhaltet. Diese Klasse soll aber kein Dialog zeigen. Ich habe sie nur von CDialog abgeleitet um die Message_Map -Funktionen zu bekommen.
    Ziel der ganzen Sache soll sein, dass ich dann - wenn alles funktioniert - eine DLL Schreiben kann, die mir die neue Klasse einbindet und mir die Funktionalität Zuverfügung stellt.
    Die Entwicklung mit dem Dialogfenster am Anfang habe ich nur gemacht um die Entwicklung mir zu erleichtern.

    Für mich ist jetzt nur noch das Problem, wenn ich der SerialPort-Klasse den This-Pointer übergebe, die MessageMap nicht aufgerufen wird.

    Von Welcher Klasse muss ich meine Klasse ableiten, wenn ich eine MessageMap will aber eigentlich kein Dialogfenster zeigenen will ?

    Gruß,
    Michi



  • Da mußt du etwas weiter oben ansetzen - laut MSDN kann jede von CCmdTarget abgeleitete Klasse eine MessageMap haben (das ist der Großvater von CDialog - und hat noch kein eigenes Fenster).

    (irgendwo in der MSDN steht auch drin, wie du dein Objekt in die Nachrichtenkette einklinken kannst - vermutlich in der Applikation)



  • Hab es jetzt mal mit der Ableitung von CCmdTarget versucht, und dann bekom ich diese Meldung:

    error C2440: 'static_cast': 'LONG (__cdecl )(UINT,LONG)' kann nicht in 'LRESULT (__thiscall CWnd:: )(WPARAM,LPARAM)' konvertiert werden


  • Mod

    Ein CCmdTarget kann keine Nachcrichten empfangen sonder nur WM_COMMAND Benachrichtigungen!

    Wenn Du Deine eigene Klasse von CDialog abgeleitet hast, dann erzeuge doch diesen Diaog auch mit DoModal! Dann sollte es gehen.

    Du kannst nurnicht in eine bestehende Klasse Deine Messagemap reinzwingen. Das würde nur mit Subclassing gehen.

    Die Frage wäre hier an dieser Stelle um Du unbedingt mit einer COMM Klasse arbeiten musst die Nachrichten verwendet...


Anmelden zum Antworten