WM_INITDIALOG einer Komponente abfangen
-
Hallo Leute,
Normalerweise fange ich eine Windows- Message einer Komponente so ab:
//In Header: void __fastcall CMMouseEnter(TMessage *); ... BEGIN_MESSAGE_MAP MESSAGE_HANDLER(CM_MOUSEENTER, TMessage *, CMMouseEnter); END_MESSAGE_MAP(TCustomControl);Jetzt möchte ich gerne WM_INITDIALOG abfangen, was mit dieser Methode jedoch nicht funktioniert.
Kann mir hierbei jemand mit etwas Code helfen???
Vielen Dank an alle Helfer,
Euer Entertainer
-
naja besser ist sicher, wenn du die WndProc ueberschreibst.
// header
private: void __fastcall WndProc(TMessage &Message);// cpp
void __fastcall TForm1::WndProc(TMessage &Message) { if (Message.Msg == WM_INITDIALOG) { // tue irgendetwas } // geerbte WndProc aufrufen inherited::WndProc(Message); }
-
Ich denke diese Nachricht kriegst du nicht wenn du mit der VCL arbeitest. Kriegst du nur wenn du mit den WinAPI Funktionen CreateDialog oder DialogBox arbeitest.
-
Hallo Sunday,
Danke für deine Antwort, ich wusste nicht, dass es auch so einfach geht. Aber leider hat arbeiter scheinbar recht, da ich keinen Zugriff auf WM_INITDIALOG habe.Gibt es denn in der VCL wirklich keine Möglichkeit diese Nachricht abzufangen???
Bitte überlegt nochmal.
Vielen Dank,
Euer Entertainer
-
Wie willst du eine Message abfangen, die überhaupt nicht (an deine Komponenten) verschickt wird?
-
arbeiter schrieb:
Ich denke diese Nachricht kriegst du nicht wenn du mit der VCL arbeitest. Kriegst du nur wenn du mit den WinAPI Funktionen CreateDialog oder DialogBox arbeitest.
Is das denn so richtig??? Ich denke nicht, Tim!
Sach doch mal einer mit Ahnung was dazu...
Ich dachte immer die VCL wäre nur ein Wrapper und die WndProc trotzdem (oder gerade desswegen) verfügbar (zumindest nutze ich die ganz erfolgreich
).
-
Ne, die VCL wrappt die Dialoge die man mit CreateDialog/DialogBox erstellen kann nicht.
Ich hab recht. 100%.
-
Also du kannst schon alle Nachrichten abfangen...aber die WM_INITDIALOG ist halt nur für Dialoge und eine TForm kriegt diese Nachricht überhaupt nicht!!
-
Auch nicht, wenn das Formular vom Typ Dialog ist???
-
arbeitest du ueberhaupt mit dialog-boxen? wenn nein warum willst du diese message abfangen? was willst du erreichen?
-
Ich möchte eine Komponente (beispielsweise ein Panel) transparent erscheinen lassen. Das geht bei Fenstern mit SetWindowLong(...) und SetLayeredWindowAttributes(...).
Bei Komponenten im C++ Builder ist dies so leider nicht möglich. Unter MSDN habe ich gelesen, dass man die WM_INITDIALOG abfangen und dann wie oben bei den Fenstern vorgehen muss.
Ich brauche die WM_INITDIALOG- Nachricht also nur, um diese Transparenz zu erreichen, oder gibt es noch eine andere Methode, um die Komponenten transparent erscheinen zu lassen???
Vielen Dank für eure Hilfe,
Euer Entertainer
-
Du kannst eh nur die ganze Form transparent machen und nicht einzelne Steuerelemente.
-
Aber ist nicht letztendlich jedes Steuerelement ein eigenes Fenster auf dem Hauptfenster? Kann man denn da wirklich nichts machen?
Vielen Dank,
Euer Entertainer
-
WS_EX_LAYERED
Windows 2000/XP: Creates a layered window. Note that this cannot be used for child windows. Also, this cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.