Frage

Ich verwende den folgenden Code, um ein Formular transparent zu machen. Wenn die Anwendung jedoch über einen VCL -Stil verfügt, ist das Formular mit der Hintergrundfarbe des VCL -Stils anstatt transparent zu sein.

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure CreateParams(var Params:TCreateParams); override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.ExStyle := WS_EX_TRANSPARENT or WS_EX_TOPMOST;
 //Params.ExStyle := Params.ExStyle or WS_EX_LAYERED;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Brush.Style:=bsClear;
 BorderStyle:=bsNone;
 //SetLayeredWindowAttributes(Handle, 0, 230, $00000002);
end;

Zu Ihrer Information Der Code funktioniert gut, wenn der VCL -Stil auf festgelegt ist Windows.

Existieren Sie eine andere Möglichkeit, eine Form transparent zu machen, um dieses Problem zu verarbeiten?

War es hilfreich?

Lösung

Es scheint mir ein Fehler zu sein. Die VCL -Stile verwenden Stilhaken Um die Farbmethoden und die Windows -Nachrichten zu diesen Vorgängen abzufangen PaintBackground Methode der TFormStyleHook Klasse in der Vcl.Forms, Von hier aus erstellen Sie eine neue Style -Hakenklasse (von der von stammt aus TFormStylehook), überschreiben Sie die PaintBackground Methode, beheben Sie den Code und verwenden Stilhaken. Überprüfen Sie diesen Artikel Fixing a VCL Style bug in the TPageControl and TTabControl components ein Beispiel sehen.

AKTUALISIERENÜberprüfen Sie dieses Beispiel

unit Unit138;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm138 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    procedure CreateParams(var Params:TCreateParams); override;
  public
  end;


var
  Form138: TForm138;

implementation

 Uses
   Vcl.Themes,
   Vcl.Styles,
   uPatch;

{$R *.dfm}

procedure TForm138.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.ExStyle := WS_EX_TRANSPARENT or WS_EX_TOPMOST;
end;

procedure TForm138.FormCreate(Sender: TObject);
begin
 Brush.Style:=bsClear;
 BorderStyle:=bsNone;
end;

initialization
 TStyleManager.Engine.UnRegisterStyleHook(TForm, TFormStyleHook);//unregister the original style hook
 TStyleManager.Engine.RegisterStyleHook(TForm, TMyStyleHookClass); //register the new style hook

end.

Die neue Style -Hakenklasse

unit uPatch;

interface

uses
  Vcl.Graphics,
  Vcl.Forms;

type
  TMyStyleHookClass= class(TFormStyleHook)
  protected
   procedure PaintBackground(Canvas: TCanvas); override;
  end;

implementation

uses
  Winapi.Windows,
  System.Types,
  Vcl.Themes;


procedure TMyStyleHookClass.PaintBackground(Canvas: TCanvas);
{This is only a basic sample for fix a specific scenario}
var
  Details: TThemedElementDetails;
  R: TRect;
begin
  if StyleServices.Available then
  begin
    if (GetWindowLong(Form.Handle,GWL_EXSTYLE) AND WS_EX_TRANSPARENT) = WS_EX_TRANSPARENT  then
    if Form.Brush.Style = bsClear then Exit;

    Details.Element := teWindow;
    Details.Part := 0;
    R := Rect(0, 0, Control.ClientWidth, Control.ClientHeight);
    StyleServices.DrawElement(Canvas.Handle, Details, R);
  end;
end;

end.

Andere Tipps

Haben Sie gesondert versucht, die zu verwenden TransparentColor und TranparentColorValue Eigenschaften anstatt die Fensterstile in zu manipulieren CreateParams()?

Ich verwende OverridePaintnc: = False, um Zeichentile im NC -Bereich zu verhindern. Und es gibt auch Overrideerasebkgnd. Vielleicht hilft diese Hilfe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top