Wie kann ich AlphaBlend
Wert (eine Form) in einer Firemonkey-Desktop-Anwendung ändern? Nun, es ist in VCL Anwendung zur Verfügung, aber ich konnte es nicht finden in Firemonkey.Alphablend in Firemonkey
Screenshot:
Wie kann ich AlphaBlend
Wert (eine Form) in einer Firemonkey-Desktop-Anwendung ändern? Nun, es ist in VCL Anwendung zur Verfügung, aber ich konnte es nicht finden in Firemonkey.Alphablend in Firemonkey
Screenshot:
Um Ihre Form Hintergrund machen semitransparent sollten Sie Form Transparency
Eigenschaft true
und verwenden Fill.Color
mit Alpha-Wert wie $AAFFFFFF
(mit Fill.Kind = bkSolid
) gesetzt. in diesem Fall Form Grenze wird unsichtbar (zumindest in Delphi XE2 )
, wenn Sie alle Komponenten in Form halbtransparent machen müssen dann TLayout
auf Formular platzieren mit Align = alContents
und legen Sie seine Opacity
Eigenschaft auf gewünschten Wert einstellen.
, wenn Sie halbtransparente Fenster mit Alpha-Blending müssen, wie es in VCL war können Sie die gleichen Methoden verwenden (für Windows-Plattform) als getWindowLong/SetWindowLong
. Set transparency
zurück zu false
und verwenden Sie Code wie folgt in Form OnCreate
Ereignishandler:
implementation
uses fmx.platform.win, winapi.windows;
{$R *.fmx}
procedure TMainForm.FormCreate(Sender: TObject);
var h : HWND;
aStyle : integer;
alphaValue : byte;
begin
h := WindowHandleToPlatform(self.Handle).Wnd;
AStyle := GetWindowLong(h, GWL_EXSTYLE);
SetWindowLong(h, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
AlphaValue := 125;
SetLayeredWindowAttributes(h, 0, alphaValue, LWA_ALPHA);
end;
natürlich alle Komponenten werden zu trasparent.
Da Sie nur nach einer Windows-Implementierung suchen, müssen Sie das Format WS_EX_LAYERED
zu Ihrem Formular hinzufügen und dann mit der Methode SetLayeredWindowAttributes
den Alpha-Wert basierend auf einem Wert oder einer Farbe festlegen.
prüfen diese Implementierung, eine Interposer-Klasse.
type
TForm = class(FMX.Forms.TForm)
private
FAlphaBlend: Boolean;
FAlphaBlendValue: Byte;
FTransparentColor: Boolean;
FTransparentColorValue: TColor;
procedure SetAlphaBlend(const Value: Boolean);
procedure SetAlphaBlendValue(const Value: Byte);
procedure SetLayeredAttribs;
procedure SetTransparentColor(const Value: Boolean);
procedure SetTransparentColorValue(const Value: TColor);
protected
property AlphaBlend: Boolean read FAlphaBlend write SetAlphaBlend default False;
property AlphaBlendValue: Byte read FAlphaBlendValue write SetAlphaBlendValue default 255;
property TransparentColor: Boolean read FTransparentColor write SetTransparentColor default False;
property TransparentColorValue: TColor read FTransparentColorValue write SetTransparentColorValue;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
uses
FMX.Platform.Win,
Winapi.Windows,
Vcl.Graphics;
type
TSetLayeredWindowAttributes = function (Hwnd: THandle; crKey: COLORREF;
bAlpha: Byte; dwFlags: DWORD): Boolean; stdcall;
var
SetLayeredWindowAttributes: TSetLayeredWindowAttributes = nil;
procedure TForm1.FormCreate(Sender: TObject);
begin
@SetLayeredWindowAttributes := GetProcAddress(GetModuleHandle(User32), 'SetLayeredWindowAttributes');
AlphaBlend:=True;
AlphaBlendValue:=200;
end;
{ TForm }
procedure TForm.SetAlphaBlend(const Value: Boolean);
begin
if FAlphaBlend <> Value then
begin
FAlphaBlend := Value;
SetLayeredAttribs;
end;
end;
procedure TForm.SetAlphaBlendValue(const Value: Byte);
begin
if FAlphaBlendValue <> Value then
begin
FAlphaBlendValue := Value;
SetLayeredAttribs;
end;
end;
procedure TForm.SetTransparentColor(const Value: Boolean);
begin
if FTransparentColor <> Value then
begin
FTransparentColor := Value;
SetLayeredAttribs;
end;
end;
procedure TForm.SetTransparentColorValue(const Value: TColor);
begin
if FTransparentColorValue <> Value then
begin
FTransparentColorValue := Value;
SetLayeredAttribs;
end;
end;
procedure TForm.SetLayeredAttribs;
const
cUseAlpha: array [Boolean] of Integer = (0, LWA_ALPHA);
cUseColorKey: array [Boolean] of Integer = (0, LWA_COLORKEY);
var
AStyle: Integer;
begin
if not (csDesigning in ComponentState) and
(Assigned(SetLayeredWindowAttributes)) then
begin
AStyle := GetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE);
if FAlphaBlend or FTransparentColor then
begin
if (AStyle and WS_EX_LAYERED) = 0 then
SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
SetLayeredWindowAttributes(WindowHandleToPlatform(Handle).Wnd, ColorToRGB(FTransparentColorValue), FAlphaBlendValue,
cUseAlpha[FAlphaBlend] or cUseColorKey[FTransparentColor]);
end
else
begin
SetWindowLong(WindowHandleToPlatform(Handle).Wnd, GWL_EXSTYLE, AStyle and not WS_EX_LAYERED);
RedrawWindow(WindowHandleToPlatform(Handle).Wnd, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ALLCHILDREN);
end;
end;
end;
Haben Sie versucht, den ColorKey selbst zu benutzen? Während die Verwendung von LWA_ALPHA für mich gut funktioniert, kann ich den anderen Teil nicht zum Laufen bringen. Das Übergeben des ColorKey (und das Definieren von LWA_COLORKEY) scheint keine Wirkung zu haben. – DNR
Check 'Transparency' (kann useTransparancy sein) und verwenden' Fill.Color' mit Alpha-Kanal Wert – teran
Versuchen Sie, die Transparenz eines Formulars zu ändern? Können Sie ein Bild des gewünschten Effekts liefern? –
Sie suchen eine plattformübergreifende Lösung? oder nur für Windows? – RRUZ