Einzelnen Beitrag anzeigen

schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

Problem mit Form Activate, Focus

  Alt 25. Aug 2009, 18:22
Hi

ich habe ein App, die StayOnTop verwendet.

Die Form besteht aus einem Panel das oben am Screen ist und nicht die ganze Desktophöhe einnimmt.
Jedoch die ganze Breite schon.

Je nach Einstellung im Programm habe ich z.B. links unter dem Panel ein weiteres kleineres Panel das nicht die ganze Desktopbreite einnimmt.
Somit sieht es dann aus wenn beide sichtbar sind wie ein auf dem Bauch liegendes "L".
Da ja keine sechseckige Form möglich ist habe ich mir mit dieser Form die Transparent gemacht:
http://www.delphipraxis.net/internal...?p=32213#32213

Es wird also die ganze Form per RGN_DIFF durchsichtig gemacht.
Dann füge ich mit RGN_OR die beiden Panels wieder ein und ein L-Form entsteht.

Soweit so gut!

Doch per Tastendruck will ich die Form verstecken/wiederanzeigen.

Hört sich leicht an - ist es aber nicht.

Lösung 1:
Visible := False geht noch, doch sobald ich wieder Visible := True mache
Werden meine 2 Panels normal angezeigt. Doch der Rest der "L" Form wird nicht transparent!?

Es schaut so aus als würde die Form gezeichnet werden und dann erst Transparent gemacht werden.
Denn wenn ich ein anderes Fenster nehme und über das graue "darüber wische" wird der Hintergrund dahinter wieder angezeigt.
Fokus wird gesetzt und nach dem Wiedereinblenden kann ich die Form per Keyboard steuern.

Lösung 2:
Ich lasse das mit Visible True/False komplett weg und mache die Form unsichtbar durch RGN_DIFF ohne die Panels hinzuzufügen.
Somit ist sie ganz versteckt.
Wenn ich sie wieder anzeigen will mache ich wieder die ganze Form Transparent und füge dann wieder die 2 Panel hinzu.
Nun bleibt die "L"-Form und der Hintergrund ist so sichtbar wie es sein soll.

Aber da ist dann das Problem, dass ich auf meine Form den Focus nicht setzen kann.
Wenn ein anderes Programm aktiv ist bleibt der Fokus darauf und ich kann meine Form nicht mehr mit den Keyboard steuern.

Ich hole beim Anzeigen die Form auch noch hiermit in den Vordergrund:
Delphi-Quellcode:
              SetWindowPos(MainFormHandle, HWND_TOPMOST, Left,Top, Width,
                 Height, SWP_SHOWWINDOW);
Auch ein Versuch mit SetFocus(MainFormHandle), Main.Activate oder Button1.SetFocus hilft nichts. Der Fokus bleibt bei dem anderem Programm.
Wenn ich mit der Mouse draufdrücke bekommt meine Main Form den Focus und Keyboard geht wieder.
Main.Active sagt mir immer True, auch wenn ein anderes Programm Aktive ist!?

Auch ein Windows.GetFocus; sagt mir das mein Handle noch den Fokus hat obwohl ein anderes Programm aktiv ist!

Ich hoffe mein Problem ist halbwegs verständlich!
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat