Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Transparentes Fenster vor anderem Fenster (https://www.delphipraxis.net/95237-transparentes-fenster-vor-anderem-fenster.html)

simjoh 3. Jul 2007 20:08


Transparentes Fenster vor anderem Fenster
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

verzweifle gleich. Ich will mein Fenster vor das Fenster einer anderen Anwendung setzten. Zudem ist mein Fenster transparent, das funzt mit

Delphi-Quellcode:
procedure TFormTransparent1.DoInvisible;
var
  AControl : TControl;
  A, Margin, X, Y, CtlX, CtlY : Integer;
begin
  Margin := ( Width - ClientWidth ) div 2;
  //First, get form region
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  //Find client area region
  X := Margin;
  Y := Height - ClientHeight - Margin;
  ClientRgn := CreateRectRgn( X, Y, X + ClientWidth, Y + ClientHeight );
  //'Mask' out all but non-client areas
  CombineRgn( FullRgn, FullRgn, ClientRgn, RGN_DIFF );

  //Now, walk through all the controls on the form and 'OR' them
  // into the existing Full region.
  for A := 0 to ControlCount - 1 do begin
    AControl := Controls[A];
    if ( AControl is TWinControl ) or ( AControl is TGraphicControl )
        then with AControl do begin
      if Visible then begin
        CtlX := X + Left;
        CtlY := Y + Top;
        CtlRgn := CreateRectRgn( CtlX, CtlY, CtlX + Width, CtlY + Height );
        CombineRgn( FullRgn, FullRgn, CtlRgn, RGN_OR );
      end;
    end;
  end;
  //When the region is all ready, put it into effect:
  SetWindowRgn(Handle, FullRgn, TRUE);
 
end;

procedure TFormTransparent1.FormDestroy(Sender: TObject);
begin
  //Clean up the regions we created
  DeleteObject(ClientRgn);
  DeleteObject(FullRgn);
  DeleteObject(CtlRgn);
end;

procedure TFormTransparent1.DoVisible;
begin
  //To restore complete visibility:
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
  SetWindowRgn(Handle, FullRgn, TRUE);
end;

procedure TFormTransparent1.FormCreate(Sender: TObject);
begin
  //We start out as a transparent form....
  DoInvisible;
end;
ganz gut, dann kann man auch noch auf die Objekte auf meinem Fenster klicken, wenn man an denen vorbeiklickt kommt aber immer das fremde Fenster in den Vordergrund.

Ich möchte gerne, dass mein Fenster immer vor nur diesem einen Fenster ist und man durchklicken kann. Die Objekte auf meinem Fenster sollen also sichtbar bleiben, auh wenn man durchklickt.

Hab noch was vergessen: Das Fenster, welches transparent sein soll, ist nicht das Hauptfenster, sondern wird vom Hauptfenster per Button "geshowed".

Hab mal ein Beipiel drangehängt.

HELP!!

simjoh 6. Jul 2007 23:39

Re: Transparentes Fenster vor anderem Fenster
 
Keiner ne Idee?

bitsetter 7. Jul 2007 09:08

Re: Transparentes Fenster vor anderem Fenster
 
Hallo,

kann das eine beliebige Anwendung sein wo du dein Fenster davorsetzen möchtest, oder ist das ein bestimmtes Fenster?
Über einen Shellhook Bei Google suchenWH_SHELL könnte man HSHELL_WINDOWACTIVATED abfangen und dann dein Fenster wieder vor das andere davorsetzen. Das Ganze ist natürlich schon etwas aufwendiger.

Ghostwalker 7. Jul 2007 09:18

Re: Transparentes Fenster vor anderem Fenster
 
Wie wärs mit Formstyle = fsStayontop ?

Ich weiß allerdings nicht ob das auch mit Fenstern von anderen Programmen funktioniert.

simjoh 7. Jul 2007 10:08

Re: Transparentes Fenster vor anderem Fenster
 
Hi,

Formstyle = fsStayontop funzt nicht, das geht nur, wenn mein Hauptfenster über dem fremden Fenster liegt, nicht beim Childfenster welches transparent sein soll. Warum das so ist, weiß ich nicht.

Mein transparentes Fenster setze ich vor ein bestimmtes Fenster, dessen HWND ich habe. Auf dem Fenster sitzen Objekte, die anklickbar sein sollen, wenn man an denen vorbeiklickt, soll mein transparentes Fenster immer im Vordergrund bleiben und einfach durchgeklickt werden. Hm, bin nicht der versierteste in Delphi, wüsste mit HSHELL_WINDOWACTIVATED jetzt nix anzufangen. Danke für die Tipps.

Sascha999999999 7. Jul 2007 11:12

Re: Transparentes Fenster vor anderem Fenster
 
wie wärs mit showModal(); ???

bitsetter 11. Jul 2007 00:35

Re: Transparentes Fenster vor anderem Fenster
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von simjoh
Mein transparentes Fenster setze ich vor ein bestimmtes Fenster, dessen HWND ich habe. Auf dem Fenster sitzen Objekte, die anklickbar sein sollen, wenn man an denen vorbeiklickt, soll mein transparentes Fenster immer im Vordergrund bleiben und einfach durchgeklickt werden. Hm, bin nicht der versierteste in Delphi, wüsste mit HSHELL_WINDOWACTIVATED jetzt nix anzufangen. Danke für die Tipps.

Hi,

mit dem HSHELL_WINDOWACTIVATED habe ich es nun mal versucht. Dazu habe ich mal Notepad mitgestartet, dessen Fenster soll dann im Hintergrund bleiben. Solange man innerhalb des Fensters von Notepad klickt funktioniert auch alles, bloß wenn man oben auf die Titelleiste klickt wird es trotzdem nach vorne geholt. Immerhin bekommt dein Programm es jedoch dann auch mit.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz