MFC: Registrierte Message kommt nicht an



  • Hallo, ich steh etwas auf'm Schlauch und bräuchte mal einen Schubser.
    Also, ich habe eine Klasse (extrem vereinfacht)

    CMeineKlasse : public CWnd {...};
    static int wm_gnWSNotifyMsg = RegisterWindowMessage(__FILE__ ":wsnotify");

    BEGIN_MESSAGE_MAP(CMeineKlasse, CWnd)
    ON_REGISTERED_MESSAGE(wm_gnWSNotifyMsg, OnNotify)
    END_MESSAGE_MAP()

    Eine Instanz von CMeineKlasse
    CMeineKlasse *meineKlasse;

    So weit, so schlecht.

    Ich benutze die Klasse in einer Single-Doc-App.

    Wenn ich in InitInstance() mache:
    meineKlasse = new CMeineKlasse;
    meineKlasse->CWnd::Create(...)
    kann ich per PostMessage() die wm_gnWSNotifyMsg senden, und die kommt auch an.

    Wenn ich aber in InitInstance() per AfxBeginThread() eine Thread starte, die (statt wie vorher InitInstance() selbst)
    meineKlasse = new CMeineKlasse;
    meineKlasse->CWnd::Create(...)
    macht, dann kann ich zwar per PostMessage die wm_gnWSNotifyMsg senden, die kommt aber nie an. Könnte mir jemand erklären, warum das so ist oder ob ich einen generellen Denkfehler begehe?

    Danke schon mal im voraus!



  • in dem Thread kannst du in InitApp..()
    CWinApp::m_pMainWnd = new(meinFenster)
    setzen.



  • Hallo Achromat,

    ich verstehe gar nix von Deiner Antwort.... 😞



  • Hi,

    wenn Du ein Fenster via CWinThread erzeugst:

    Pseudo:

    class CLicenceTst : public CWinThread
    {
    public:
    	int m_Class;
    
    	CLicenceTst::CLicenceTst(int Stat)
    	{
    		CreateThread(CREATE_SUSPENDED);
    	        m_bAutoDelete = true;
    		ResumeThread();
    	}
    
    	BOOL CLicenceTst::InitInstance()
    	{
    		AfxEndThread(0);
    		delete this;
    		return TRUE;
    	}
    };
    

    und dort eine Nachricht (zb. Im Konstruktor) registerst

    UINT NEM_SHOWPOPUP        = ::RegisterWindowMessage(_T("NEM_SHOWPOPUP-{84252E3C-DBD7-4fb6-A56A-160A0D00816A}"));
    

    Kannst Du diese auch normal an das Fenster senden via

    SendMessage(NEM_SHOWPOPUP);
    

    Musst dann aber auch einen Behandler in deine Fensterklasse eintragen

    BEGIN_MESSAGE_MAP(CNumericEdit, CWnd)
    ON_REGISTERED_MESSAGE(NEM_SHOWPOPUP, OnShowPopup)
    END_MESSAGE_MAP()
    

    Der sieht dann im cpp deiner Fensterklasse so aus:

    afx_msg LRESULT CNumericEdit::OnShowPopup(WPARAM /*wParam*/,LPARAM /*lParam*/)
    {
    }
    

    und auch in dessen Header datei deiner Fensterkalsse, muss unten der callback refrenziert sein:

    afx_msg LRESULT OnShowPopup(WPARAM wParam,LPARAM lParam);
    

    ggf. sollte auch die Member CWinApp::m_pMainWnd
    auf dein mit new() erzeugtem Objekt zeigen

    Interessante Referenz :
    http://read.pudn.com/downloads98/sourcecode/windows/control/edit/400857/NumericEdit_Demo/NumericEdit.h__.htm
    http://www.codeproject.com/script/Content/ViewAssociatedFile.aspx?rzp=%2FKB%2Fmiscctrl%2FJgNumericEditArticle%2F%2Fnumericedit_src.zip&zep=NumericEdit.cpp&obid=6740&obtid=2&ovid=1

    VidInAction:
    https://www.youtube.com/watch?v=227ixJZE1fk

    PS: Dein CodeSnip :

    ON_REGISTERED_MESSAGE(wm_gnWSNotifyMsg, OnNotify)
    

    Du kannst nicht vorhandene SystemNotifications einfach so mit einer neuen Nachrticht verbinden, OnNotify ist bereits eine registered Message
    Was dann passiert möchte ich nicht wieter untersuchen ..

    Grüße
    Karsten



  • Hallo Achromat,

    vielen Dank für Deine verständliche Erklärung!

    Jetzt klappt's auch so, wie ich mir das vorgestellt habe 🙂

    Noch eine abschließende Frage:
    Durch das Ableiten einer Klasse von CWnd hat die Klasse selbst wohl keine funktionierende MsgPump? Erst wenn die Klasse in einer anderen Klasse mit eigener MsgPump erzeugt wird?

    Grüße!



  • Die MsgPump befindet sich in der Methode CWinApp::Run

    die abgeleitetet klasse von CWnd hängt lediglich Daten und Funktionen an das
    CWnd von dem es hergelitten ist.

    gz
    ks


Anmelden zum Antworten