Autor Beitrag
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 10.09.07 15:41 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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).

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
HelgeLange
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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?

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
delfiphan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mi 12.09.07 21:26 
Nun, ich hab's jetzt gefunden:

ausblenden Delphi-Quelltext
1:
2:
SetWindowLong(handle, GWL_EXSTYLE,GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE); 
SetWindowPos(Handle, HWND_NOTOPMOST + WORD(true), 0000, 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