Wurde im Parent einer eigenen Kompo geklickt?
-
Hallo Ihr hier im Forum...
Ich möchte mir so eine Kompo wie z.b. TPopUpMenu erstellen. Diese soll eine
Eigenschaft haben, in der der Parent (TWinControl) angegeben wird. Jetzt muss
ich im Programm, dann aber wissen, ob im Parent geklickt wurde, also ob das
Menu nun angezeigt werden soll oder nicht.
Also da denke ich mal, muss ich im Quelltext der Kompo irgendwie die Messages
des Parents abfangen, habe aber keine Ahnung wie ich das anstellen soll...Danke schonmal im vorraus...
MFG Aoeke
-
Setz eine neue WindowProc für dein Parent. Wie das geht, erfährst du in der FAQ (Window Messages).
-
WebFritzi deine Antwort stimmt irgendwie nicht so ganz.
-
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