gpt4 book ai didi

delphi - VCL组件不透明度/透明度

转载 作者:行者123 更新时间:2023-12-03 15:14:09 32 4
gpt4 key购买 nike

是否可以制作例如 20% 透明的 TMemo 或其他 vcl 组件?像 TButton 或 TEdit 吗?

在谷歌搜索解决方案时,我发现了这个:

http://img21.imageshack.us/img21/7865/screenshotizn.png

From Here ,然后我想,如果我在窗体上绘制图像(OnPaint)然后设置AlphaBlend ON,我可以实现此效果但没有成功,当整个窗体透明时,未实现主要需要的效果,备忘录后面没有背景图片。

enter image description here

我想要达到的效果:(在photoshop中完成的) enter image description here

这可能吗?如果是,怎么样? (我不要求任何人提供完整的源代码,只要可能的话,只要文章或小例子,或者方向,无论我能理解它的方式)

感谢您的关注。

<小时/>

我找到了解决方案,在具有图像背景的表单上创建字母混合表单,然后在添加的表单上添加备忘录并将其与客户端对齐,这不是最好的方法,但它工作正常: enter image description here

procedure TForm1.Button1Click(Sender: TObject);
var
MM : TMyMemo; frm : TForm;
begin
frm := TForm.Create(Form1);
frm.BorderStyle := bsNone;
frm.AlphaBlend := true;
frm.AlphaBlendValue := 150;
frm.Left := Form1.Left + 90;
frm.Top := Form1.Top + 90;
frm.Width := 300;
frm.Height := 300;
frm.Position := poDesigned;
frm.Visible := true;

MM := TMyMemo.Create(frm);
MM.Parent := frm;
MM.BorderStyle := bsNone;
MM.ParentColor := False;
MM.Align := alClient;
MM.Color := clBlack;
MM.Font.Color := clWhite;
MM.Font.Name := 'Sylfaen';
MM.Font.Size := 11;
MM.Visible := True;

frme := True;
end;

但是还有一个问题,当我按下备忘录时,背景表单失去焦点,当我将新表单的父级设置为Form1时,上述问题解决了,但透明效果消失了(窗口仍然是透明的,但你可以通过bg看到窗口没有可见背景)我该如何解决这个问题?

最佳答案

我认为这个问题经常被问到(也许不是在这里,但我以前见过很多次)。奇怪的是,答案几乎从来没有出现过,尽管它就在那里,隐藏在所有讨论这个问题的人之中。也许这里的问题将有助于改进 future 的搜索过程,仅仅因为它是 stackoverflow :-)

无论如何,这是我去年找到的答案(见下面的代码)。不是我的,但对我有用 - 链接到 author 。本质上,该代码定义了一个派生的 RichEdit,其中包含 WM_ERASEBACKGROUND 消息的自定义事件处理程序。

unit TransparentRichEdit;

{ Component made by Proger_XP | http://Proger.i-Forge.net }

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, ComCtrls, Graphics;

type
TTransparentRichEdit = class (TRichEdit)
protected
FCanvas: TCanvas;
FBackground: TPicture;

procedure CreateWnd; override;
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

procedure SetBackground(const Value: TPicture);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Background: TPicture read FBackground write SetBackground;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Miscellaneous', [TTransparentRichEdit]);
end;

{ TTransparentRichEdit }

constructor TTransparentRichEdit.Create(AOwner: TComponent);
begin
inherited;
FCanvas := TCanvas.Create;
FBackground := TPicture.Create;
end;

destructor TTransparentRichEdit.Destroy;
begin
FBackground.Free;
FCanvas.Free;
inherited;
end;

procedure TTransparentRichEdit.CreateWnd;
begin
inherited;
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_TRANSPARENT);
end;

procedure TTransparentRichEdit.WMEraseBkgnd(var Message: TWMEraseBkgnd);
var
UpdateRect: TRect;
Rgn: HRGN;
ToBeErased: Boolean;
Mem: TBitmap;
begin
ToBeErased:= false;
Mem := TBitmap.Create;
try
Mem.Width := ClientWidth;
Mem.Height := ClientHeight;

FCanvas.Handle := Message.DC;
Message.Result := 1;

if not GetUpdateRect(Handle, UpdateRect, ToBeErased) then
UpdateRect := Rect(0, 0, ClientWidth, ClientHeight);
with UpdateRect do
Rgn := CreateRectRgn(Left, Top, Right, Bottom);
SelectClipRgn(FCanvas.Handle, Rgn);

FCanvas.Draw(0, 0, FBackground.Graphic);
finally
Mem.Free;
end;
end;

procedure TTransparentRichEdit.SetBackground(const Value: TPicture);
begin
FBackground.Assign(Value);
Repaint;
end;

end.

关于delphi - VCL组件不透明度/透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17014360/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com