Wurde im Parent einer eigenen Kompo geklickt?
-
Application->OnMessage
-
Danke erstmal...
@ WebFritzi : Wo müsste ich die WindowProc denn hinsetzen??? Doch eigentlich im
Quelltext des Parents, oder??? Ich will ja aber allgemein für die Kompo
programmieren, dass sie erscheint, wenn im Parent geklickt wurde.
Ich habe das jetzt mal mit MessageHandler probiert, da empfängt der aber keine
Message... Also so habe ich das MessageHandler-Teil gemacht:BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_RBUTTONDOWN, TMessage *, ParentMouseDown); END_MESSAGE_MAP(inherited);
Und in ParentMouseDown steht erstmal nichts wichtiges, aber die Funktionen in
ParentMouseDown führt der halt nicht aus, weil der irgendwie keine Message
empfängt...Was mache ich falsch???
MFG Aoeke
@ AndreasW : Oh werde ich gleich mal ausprobieren...
[ Dieser Beitrag wurde am 09.03.2003 um 19:43 Uhr von Aoeke editiert. ]
-
hi,
MESSAGE_HANDLER werden nur für Nachrichten aufgerufen, die an das Fenster gerichtet sind.
Application->OnMessage wird aufgerufen, wenn eine Nachricht an irgend ein Fenster der Anwendung gesendet wird. Reagiere auf dieses Ereignis.
//---------------------------------------------------------------------------- void __fastcall TMLPopUpWindow::CreateWnd(void) { TCustomControl::CreateWnd(); DefaultApplicationMessage=Application->OnMessage; Application->OnMessage=OnAppMessage; } __fastcall TMLPopUpWindow::~TMLPopUpWindow() { Application->OnMessage=DefaultApplicationMessage; } //--------------------------------------------------------------------------- void __fastcall TMLPopUpWindow::OnAppMessage(MSG& Msg, bool& Handled) { if(DefaultApplicationMessage) DefaultApplicationMessage(Msg,Handled); if(Visible &&Msg.hwnd!=Handle &&(Msg.message==WM_LBUTTONDOWN || Msg.message==WM_RBUTTONDOWN)) { // mach was } }
[ Dieser Beitrag wurde am 09.03.2003 um 19:48 Uhr von AndreasW editiert. ]
-
Auch dir erstmal danke.
Jetzt weiß der allerdings nichts mit DefaultApplicationMessage anzufangen,
Also wo muss ich das noch definieren?MFG Aoeke
-
Hi,
in der Header:
class PACKAGE TMLPopUpWindow : public TCustomControl { private: TMessageEvent DefaultApplicationMessage; public: virtual __fastcall ~TMLPopUpWindow(); }
[ Dieser Beitrag wurde am 09.03.2003 um 20:08 Uhr von AndreasW editiert. ]
-
OK jetzt bin ich denke ich mal ziemlich durcheinander gekommen...
Also ich habe jetzt:/* Header-Datei */ public: __fastcall TColoredPopUpMenu(TComponent* Owner); // Ist ja Standard immer drin virtual __fastcall ~TColoredPopUpMenu(); private: TMessageEvent DefaultApplicationMessage; protected: void __fastcall CreateWnd(void); void __fastcall OnAppMessage(MSG& Msg, bool& Handled); //---------------------------------------------------------------------- /* cpp-Datei */ __fastcall TColoredPopUpMenu::TColoredPopUpMenu(TComponent* Owner) : TCustomControl(Owner) { } //--------------------------------------------------------------------------- __fastcall TColoredPopUpMenu::~TColoredPopUpMenu() { Application->OnMessage = DefaultApplicationMessage; } //--------------------------------------------------------------------------- void __fastcall TColoredPopUpMenu::CreateWnd(void) { TCustomControl::CreateWnd(); DefaultApplicationMessage = Application->OnMessage; Application->OnMessage = OnAppMessage; } //--------------------------------------------------------------------------- void __fastcall TColoredPopUpMenu::OnAppMessage(MSG& Msg, bool& Handled) { if(DefaultApplicationMessage) { DefaultApplicationMessage(Msg,Handled); } if(Visible && Msg.hwnd != Handle && Msg.message==WM_RBUTTONDOWN) { ShowMessage("Tach Auch"); } } //---------------------------------------------------------------------------
Wieder mal empfängt der garnichts?!? Warum nicht?
MFG Aoeke
-
Hi,
sieht doch gut aus. Wo klickst du denn mit der rechten Maustaste drauf ?
-
Na also ich habe die Kompo jetzt halt Manuell in ein Projekt gepackt, wo der
Parent = Form1 ist.
Und da klicke ich dann auch mit Rechts rauf und nichts passiert...
Kein "Tach auch" erscheint...MFG Aoeke
P.S. Man ich muss dich hier jetzt ja mal loben, so schnell wie die Antworten
immer kommen...
-
Hi,
setzt mal in der Methode OnAppMessage HAltepunkte. Prüfe ob dort überhaupt Nachrichten ankommen.
DAs musse eigentlich funktionieren.
-
Prüfe ob dort überhaupt Nachrichten ankommen.
DAs musse eigentlich funktionieren.Nope. Leider nicht. Es kommt nichts an.
Warum ist das nur alles so schwierig???MFG Aoeke
-
Hast du auch das geheime Hauptfenster überhaupt erstellt?
-
Original erstellt von <Fritz>:
Hast du auch das geheime Hauptfenster überhaupt erstellt?Was meinst du jetzt damit???
MFG Aoeke
-
Application->OnMessage ist hier IMHO total unangebracht. Der Benutzer der Kompo weiß ja nichts davon. Was nun, wenn er Application->OnMessage eine andere Funktion zuweist?
Die neue WindowProc für das Parent braucht nicht in den Quelltext der Parent-Klasse!
-
hm,
setz mal vor der Zeilen einen Haltepunkt:
-> Application->OnMessage = OnAppMessage;
-> if(Visible && Msg.hwnd != Handle && Msg.message==WM_RBUTTONDOWN)Der Debugger müsste bei beiden halten.
Das muss funktionieren...
-
@Aoenke: Er ist ein Troll. Ignoriere ihn und lies dir lieber meine letzten Beitrag auf Seite 1 durch.
-
Ich bin überhaupt kein Troll. Das mit dem geheimen Fenster steht sogar in den FAQs.
-
Original erstellt von WebFritzi:
Die neue WindowProc für das Parent braucht nicht in den Quelltext der Parent-Klasse!Also kann ich das auch in den Kompo-Quelltext reinbringen ja???
Aber wenn ich das mache, fängt der doch die Messages von der Kompo ab, oder
irre ich mich da???@ AndreasW : Der hält aber bei keinem der beiden...
MFG Aoeke
-
Original erstellt von WebFritzi:
Application->OnMessage ist hier IMHO total unangebracht. Der Benutzer der Kompo weiß ja nichts davon. Was nun, wenn er Application->OnMessage eine andere Funktion zuweist?
Die neue WindowProc für das Parent braucht nicht in den Quelltext der Parent-Klasse!ähm, das Problem besteht immer. Mit dein Vorschlag die WindowProc des Parent zu überschreiben machst du ja genau das selbe. Beides sind Funktionspointer.
Nur das deine Version ein Hacken hat. Der Parent könnte ja auch ein Panel sein. Was ist nun , wenn der User auf ein andere Panel klickt ? Das kannst du dann ja nicht mehr abdecken... Sogesehen ist dein Lösungsansatz wohl unangebracht.
-
ziehe folgende CodeZeilen in den Konstruktor:
DefaultApplicationMessage = Application->OnMessage; Application->OnMessage = OnAppMessage;
dann müsste es gehen...
-
OK das geht erstmal, der empfängt Messages...
if(/*Visible && Msg.hwnd != Handle && */Msg.message == WM_RBUTTONDOWN) { ShowMessage("Tach Auch"); }
Das Visible && Msg.hwnd != Handle habe ich erstmal "weggemacht", da der
mir dann immer die Exception Element " hat kein übergeordnetes Fenster.
aufn Tisch schmeißt...
Jetzt reagiert der aber auf alle WM_RBUTTONDOWN der gesamten Anwendung...
Wie kann ich das jetzt machen, dass der nur die des Parent verwendet???