Entwickler-Ecke
Windows API - Code-Complete-ähnlicher Popup
delfiphan - Mo 10.09.07 15:41
Titel: Code-Complete-ähnlicher Popup
Hallo
Ich würde gerne ein Popup-ähnliches Control öffnen, welches folgende Eigenschaften hat:
- Es "schwebt" überhalb der Form, d.h. kann wie ein TPopupMenu über die Form hinausragen.
- Es sollte auf Mausklicks reagieren, insbesondere soll der Scrollbalken funktionieren.
- Das Fenster sollte trotz Mausklicks nicht den Fokus erhalten.
Dieses Verhalten ist z.B. beim Code-Complete in Delphi beobachtbar (einfach mal Ctrl-Leertaste drücken).
Leider krieg ich das auch längerem Probieren und Recherchieren nicht hin.
Ich habe z.B. in CreateParams folgendes probiert:
Delphi-Quelltext
1: 2:
| with Params do ExStyle := ExStyle or WS_POPUP or WS_EX_TOPMOST or WS_EX_NOACTIVATE |
dann reagiert das Control leider überhaupt nicht mehr auf Mausklicks, d.h. insbesondere der Scrollbalken reagiert nicht. Ohne das WS_EX_NOACTIVATE wird aber der Fokus beim Klick gesetzt, was wie gesagt unerwünscht ist.
Im Grunde werden solche Fenster häufig eingesetzt z.B. bei Code-Complete, Popup Menu, selbstgebastelte ComboBoxes, Hints mit Scrollbalken. Ich habe die Sources solcher Controls angeschaut, bin aber auf keine saubere Lösungen gestossen.
Zum Teil wird z.B. der Fokus abgefangen und sofort wieder das darunterliegende Control aktiviert, was sich durch ein Flackern bemerkbar macht.
Wie implementiert man das korrekt?
Danke
delfiphan
BenBE - Mo 10.09.07 16:59
Probier mal, ob's geht, bei dem Teil die WndProc zu überschreiben und die Fokus-Nachrichten entsprechend zu beantworten (Also CAN_FOKU false und Bei WM_FOKUS den Fokus zurückgeben).
HelgeLange - Mo 10.09.07 17:12
Eigenes Fenster ohne Rahmen mir Listbox drin. Dann solltest Du alles haben. Das ganze mit Show zeigen, damit du auch woanders klicken kannst, wobei das Fester dann geschlossen wird... Zumindest glaube ich das so vor Jahren mal gemacht zu haben, bin nur zu faul zu suchen im alten Code :p
delfiphan - Mo 10.09.07 17:16
@HelgeLange: Nur wird das darunterliegende Fenster dann deaktiviert. Das darunterliegende Fenster wird also ausgegraut, dass soll nicht passieren.
@BenBE: Bin mir nicht ganz sicher, was du mit CAN_FOCUS meinst. Und bei WM_SETFOCUS - wenn die Message ankommt ist es bereits zu spät, denn das darunterliegende Fenster/Control wurde bereits deaktiviert.
Im Prinzip müsste man Windows dazu bringen, SetFocus auf mein Popupfenster zu ignorieren... Also Can_focus klingt schon mal nicht schlecht, finde aber nichts derartiges. Es ist mir eigentlich egal, wenn das Control selbst meint, es sei fokussiert.
Hauptsache das Fenster darunter bleibt fokussiert, und das Control ist immer noch "entered" (meinetwegen muss das Control selbst nicht zwingend fokussiert, das Fenster aber schon. Also quasi ein floating Child-Control eines Controls auf der Mainform).
BenBE - Mo 10.09.07 17:39
IIRC fragt Windows beim Zielfenster erst nach, bevor es diesem den Fokus erteilt, ob dieses den Fokus überhaupt erhalten kann.
delfiphan - Mi 12.09.07 13:40
Eine entsprechende Message habe ich bislang noch nicht gefunden. Aber so kompliziert kann es fast nicht sein. Das ist doch ein Standardproblem mit WinAPI, oder nicht?
BenBE - Mi 12.09.07 20:17
Bei WM_SetFocus erhält man als wParam das Handle des Fensters, was den Fokus verloren hat. Ich wusste doch, da war was ^^. Kannst Du ja mal das Verhalten testen?
delfiphan - Mi 12.09.07 21:26
Nun, ich hab's jetzt gefunden:
Delphi-Quelltext
1: 2:
| SetWindowLong(handle, GWL_EXSTYLE,GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE); SetWindowPos(Handle, HWND_NOTOPMOST + WORD(true), 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); |
Das scheint zu funktionieren, wenn man es ins FormCreate schreibt. Dann stiehlt die Form den Fokus von anderen Windows nicht mehr. In meinem eigenen Control hat's noch nicht geklappt, aber ich denke das werde ich schon schaffen ;)
Danke
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!