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 zeigenInteressante 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=1VidInAction:
https://www.youtube.com/watch?v=227ixJZE1fkPS: 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