Clickactivation verhindern
-
Hi,
ich bin grade dabei ein custom control zu schreiben und habe folgendes Problem.
Also das control ist im prinzip so ähnlich wie eine ComboBox als Drop-Down-List. Also ich erstelle ein Fenster als WS_CHILD (logischerweise) in einem Dialog. Das Fenster erstellt nun wieder ein Unterfenster als WS_POPUPWINDOW. Ich weiß nicht ob das wichtig ist aber beim erstellen des Unterfensters nehme ich als parent window das child window und nicht den dialog.
Wie auch immer, wenn ich nun auf das Fenster klicke ist alles i.o., das Unterfenster wird angezeigt aber der Dialog bleibt Foreground Window. Wenn ich nun aber auf das Unterfenster klicke wechselt der foreground vom Dialog zum Unterfenster (WM_ACTIVATE). Habe bei MSDN gefunden dass der EX-Style WS_EX_NOACTIVATE die Click-Activation verhindern soll. Ich hab es bei beiden Fenstern probiert, es hilft einfach nicht. Ich fange WM_LBUTTONDOWN auch nur vom Elternfenster ab.Bin jetzt ziemlich ratlos... ich bringe das Fenster auch wirklich nirgends in den Vordergrund. Wie gesagt WM_LBUTTONDOWN wird für das Popupfenster überhaupt nicht abgefangen...
-
In der DefWindowProc ist eine Standardbehadlung für Mausklicks...
Die macht Dein Fenster aktiv... den Rest erledigen wieder die WindowProcs der anderen Fenster.Was soll denn passieren?
Passt Dir nur etwas nicht im Stil (d.h.) soll nur der Dialog activ bleiben.
Das müsstest Du mit dem Senden einer WM_NCACTIVATE Nachricht an das Parent ändern können.
-
Genau, also im Prinzip möchte ich in dem Fenster rumklicken wie ein Idiot und trotzdem bleibt der Dialog im vordergrund. Bei dem Drop-Down der Combobox schließt sich ja das Unterfenster wenn man einen Eintrag anklickt. Das ist der einzige Unterschied den ich realisieren will.
Nun sagt MSDN für WS_EX_NOACTIVATE "A top-level window created with this style does not become the foreground window when the user clicks it. ". Komisch dass das nicht funktioniert.Klar ich könnte natürlich auch in der WM_ACTIVATE wenn das Unterfenster aktiviert wird SetForegroundWindow(hDlg) aufrufen, wobei hDlg natürlich mein Dialog-HWND ist, nur ist das nicht sehr elegant.
Das mit der WM_NCACTIVATE verstehe ich nicht so ganz. Also warum die WM_NCACTIVATE und nicht die normale WM_ACTIVATE?Nochmal zum DefWindowProc... Also du sagst die ist es, die das Fenster in den Vordergrund bringt. Ich könnte WM_LBUTTONDOWN also auch für das Unterfenster abfangen und einfach nur return 0; machen oder?
EDIT: Das mit dem SetForegroundWindow funktioniert natürlich nur wenn ich per SetWindowPos mein Unterfenster wieder hervorhebe aber nicht in den Vordergrund bringe. Es gibt da ja den Parameter SWP_NOACTIVATE.
-
vielleicht habe ich auch den falschen Ansatz.
Beim Standard Combobox-Dropdown wird ja irgendwie alles andere was so im Fenster passiert ignoriert. Beispielsweise funktionieren die Hovers bei allen anderen Comboboxen dann nicht mehr, der Cursor wechselt nicht wenn man über ein Edit Control geht (usw.) und wenn man irgendwohin klickt (egal wo hin) dann wird auch das Dropdown-Fenster geschlossen. Im Prinzip brauche ich es fast genau so. Nur wie lässt sich das realisieren? Ein Fenster erstellen und über den gesamten Dialog positionieren und nur unter der eigentlichen Combobox zeichnen?! Das kann ich mir eigentlich nicht vorstellen...