Wiondows Message und zugehörige Memberfunktion selbst definieren



  • Hallo,
    ich schreibe ein MFC Dialogfenster Programm, bei dem ich eine Ereignis über eine selbst definierte Windows message an das Hauptfenster weitergeben will.
    Ich bin mir aber noch nicht ganz sicher wie das funktioniert. Ich habe dafür eine Message registriert:

    const UINT CIIE_MPP::msg_Iie_Interpret_Recv = ::RegisterWindowMessage(_T("CIIE_Interpret_InputComMsg"));
    wie kann ich für die angelegte Message eine Memberfunktion im Hauptfenster anlegen, die immer aufgerufen wird, wenn ich ::PostMessage aufrufe.
    Und wie ist die genaue Syntax wie ich ::PostMessage aufrufe?
    Wäre wirklich dankbar, wenn mir jemand einen template Code posten könnte.



  • Ohne registered message:

    #define UWM_DO_ACTION	(WM_APP+200)
    

    in message map von CDlg2:

    ON_MESSAGE(UWM_DO_ACTION, OnDoAction)
    

    Empfänger:

    LRESULT CDlg2::OnDoAction(WPARAM wParam, LPARAM lParam)
    {
    	...
    	return 0L;
    }
    

    Sender:

    if( !::PostMessage(HWND_von_CDlg2, UWM_DO_ACTION, (WPARAM)p1, (LPARAM)p2 ) )
    	ASSERT( FALSE );
    


  • Vielen Dank für die detaillierte Beschreibung. Da ich eine Schnittstelle zu einer anderen Applikation erstelle muss ich es dummerweise mit RegisterWindowMessage realisieren.

    soweit ich weiß, muss ich im Header des Empfängers die Nachricht wie folgt definieren:

    LRESULT Log_entry(WPARAM _ptxt, LPARAM dummy);

    und in der Cpp Datei wie folgt:

    ON_REGISTERED_MESSAGE(Log::mg_Log_Msg,Log_entry)

    allerdings bekomme ich beim ausführen die fehlernachricht:

    error LNK2001: Nichtaufgeloestes externes Symbol...
    Ist wahrscheinlich zu allgemein um eine mögliche Fehlerquelle zu identfizieren, oder?


  • Mod

    Du hast wahrscheinlich Log::mg_Log_Msg nur deklariert aber nicht definiert.



  • definiere ich Log::mg_Log_Msg nicht einfach mit:
    mg_Log_Msg = ::RegisterWindowMessage(...);
    ??


  • Mod

    Klar. Und wo und wie machst Du das?



  • Das mache ich nn einer .CPP Datei, eines anderen Projectes. Von dem habe ich aber die Header includiert..


  • Mod

    1. Und diese CPP Datei ist mit im Projekt?
    2. Zeige mal den Code. Ist das wirklich die Initialisierung der statischen Variablen?



  • Hallo Bronkobob,

    ich habe mir für Registered Messages ein Makro gebaut (geklaut):

    #define DECLARE_USER_MESSAGE(name) \
    	const TCHAR name##_MSG[] = _T(#name)_T("-{8DDF4A25-CD45-45d5-BE6F-9D708BA6BF44}"); \
    	static const UINT name = ::RegisterWindowMessage(name##_MSG);
    

    Wenn Du das Benutzen willst, dann generiere für den 8DDF4A25 String eine eigen GUID.

    Dann im Empfänger.cpp mache ich das:

    DECLARE_USER_MESSAGE(UWM_MY_SPECIAL_MSG)
    
    BEGIN_MESSAGE_MAP(CDirectoryComboBox, CIconComboBox)
    	ON_REGISTERED_MESSAGE(UWM_MY_SPECIAL_MSG, OnSpecialMsg)
    END_MESSAGE_MAP()
    

    und in jedem *.cpp File in welchem ich die Message senden will gleich nach den
    includes:

    DECLARE_USER_MESSAGE(UWM_MY_SPECIAL_MSG)
    

    damit kann ich Send- und Postmessage wie gewohnt benutzen.

    Da es damit so einfach geht, benutze ich für eigene Messages nur noch Registered Messages.

    Herzliche Grüsse
    Walter


Anmelden zum Antworten