Nachrichtenbehandlung von BN_CLICKED nur über ParentWnd möglich?
-
Ich habe mal eine Frage zu Buttons. Eine user-definerte Button-Klasse soll bei einem Klick eine bestimmte Aktion ausführen und das Signal dann an den Parent weiterleiten.
Wenn ich danach gehe, wie ein Button in der MFC erstellt wird, nämlich mit CButton::Create, dann bräuchte man ja zwingend ein Parent-Fenster, wo sich dann der Button befindet und dass dann Klick-Signale empfängt. Nur würde ich das gerne trennen, d.h. der Button soll in einem Parent-Fenster platziert werden, aber die Klick-Nachrichten sollen auch auf einer anderen Ebene verarbeitet werden können. Wenn ich die virtuelle Funktion DefWindowProc von CWnd bei meiner Button-Klasse überschreibe, bekommt der Button selber keine Nachrichten ausser BN_FOCUS, BST_KILLFOCUS, WM_MOUSEMOVE und noch einer (es war nicht WM_COMMAND).
Gibt es dazu irgendwelche Möglichkeiten?
-
Eine Idee war, statt die Klasse von CButton abzuleiten, sie von CWnd abzuleiten und den Button dann als member zu behandeln, der dann das Klassenobjekt als Parent hat. Aber dann kann ich ihn mit dem Visual Studio Dialogeditor nicht mehr platzieren (oder nur mit Mehraufwand), eine andere Lösung wäre irgendwie sauberer.
-
1. Senden alle Buttons ihre WM_COMMAND Nachricten immer an das Parent.
Nicht nur in der MFC. Das macht auch die API so.
2. Du kannst OnChildNotify überschreiben und WM_COMMAND mit BN_CLICKED selber behandeln.
3. DefWindowProc hier zu überschreiben ist komlplett falsch. Schon gar in der MFC.
-
Martin Richter schrieb:
1. Senden alle Buttons ihre WM_COMMAND Nachricten immer an das Parent.
Nicht nur in der MFC. Das macht auch die API so.
2. Du kannst OnChildNotify überschreiben und WM_COMMAND mit BN_CLICKED selber behandeln.
3. DefWindowProc hier zu überschreiben ist komlplett falsch. Schon gar in der MFC.1. Immer an das Parent, heisst also ausschliesslich dahin und sonst nirgendwohin? Wenn ja, woher weiss man sowas? Ich habe nach sowas in der MSDN vergeblich gesucht. Ist das sowas wie Folklore unter den Gurus
2. Dazu brauche ich dann aber ein Parent, bei dem ich diese Funktion überschreibe, oder?
3. War n Versuch wert
Ich habe jetzt gesehen, dass es in der MFC (ab Version 4.0) für userdefinierte Controls auch noch die Möglichkeit gibt, Nachrichten zu "reflektieren" und dem Steuerelement damit die Chance, das Signal selber weiterzuverarbeiten.
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
Die Makros, mit denen das passiert, sind für mich leider etwas undurchsichtig, weswegen ich jetzt nicht sagen kann, wie sowas in API Sprache realisiert wird. Jedenfalls danke für die Hilfe.
LG eckalb
Edit: Habe jetzt gesehen, dass OnChildNotify ein Member vom Child ist. Die Bezeichner können ganz schön irreführend sein
-
In der API kannst Du sowas gar nicht bauen, weil Du dort kein hierarchisches Klassengerüst hat, indem die API in der WndProc das Parent von der der selben Basisklasse kennt.
Klar kannst Du das nachbauen... aber aufwendig.
Du musst hier in jedem Fall das Parent subclassen.