gpt4 book ai didi

delphi - 如何使 TFrame 具有圆角?

转载 作者:行者123 更新时间:2023-12-03 14:41:40 27 4
gpt4 key购买 nike

我想制作一个基于 TFrame 的组件,其中包含 TLMDShapeControl (用于绘制圆角背景)和 TEdit 控件(可以也可以是 TComboBoxTDBEdit 等等)。之后,我将使用“添加到调色板”命令将其变成可重用组件控件。

问题在于我需要它的宽度灵活,为此我有想法将框架 alClientTEdit 内的所有内容都变成 5 像素边距,这样用户可以看到圆角。

这太糟糕了,因为我无法使用对齐并将组件设置在另一个组件的顶部。现在我每次需要使用它时都必须复制并粘贴组件! :-(((

我认为正确的唯一方法是仅使用带有 alClient 和 5px 边距的 TEdit,而不使用 TShape。相反,我可以将 TFrame 设为具有透明度的圆角,这样它在不同颜色或 TImages 上就不会显得难看。

但是我该怎么做呢?

有人有代码示例吗?

this is the goal: transparent rounded corners

最佳答案

要回答你的问题如何制作带有圆角的框架,你可以尝试这样的方法,但是你会对结果不满意,因为 CreateRoundRectRgn这里使用的没有抗锯齿功能。

type
TFrame1 = class(TFrame)
Edit1: TEdit;
Button1: TButton;
protected
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
end;

implementation

procedure TFrame1.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
Region: HRGN;
begin
inherited;
Region := CreateRoundRectRgn(0, 0, ClientWidth, ClientHeight, 30, 30);
SetWindowRgn(Handle, Region, True);
end;

更新:

由于 GDI 没有任何支持圆弧渲染抗锯齿的功能,我在这里发布了一个使用 GDI+ 的圆角矩形形状(只是一个纯填充的圆角矩形)的示例(为此,您将需要 GDI+ 包装器from here)。

以下属性对其使用很重要:

  • 颜色 - 形状填充颜色(可以增强笔颜色、渐变等)
  • Radius - 是用于绘制圆角的圆的​​半径(以像素为单位)
  • AlphaValue - 是渲染的圆角矩形的不透明度值(只是为了好玩:-)

unit RoundShape;

interface

uses
SysUtils, Classes, Controls, Graphics, GdiPlus;

type
TCustomRoundShape = class(TGraphicControl)
private
FRadius: Integer;
FAlphaValue: Integer;
procedure SetRadius(Value: Integer);
procedure SetAlphaValue(Value: Integer);
protected
procedure Paint; override;
property Radius: Integer read FRadius write SetRadius default 10;
property AlphaValue: Integer read FAlphaValue write SetAlphaValue default 255;
public
constructor Create(AOwner: TComponent); override;
end;

TRoundShape = class(TCustomRoundShape)
public
property Canvas;
published
property Align;
property AlphaValue;
property Anchors;
property Color;
property Constraints;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Font;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property Radius;
property ShowHint;
property Visible;
property OnClick;
property OnContextPopup;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnMouseActivate;
property OnMouseDown;
property OnMouseEnter;
property OnMouseLeave;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
end;

procedure Register;

implementation

{ TCustomRoundShape }

constructor TCustomRoundShape.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Width := 213;
Height := 104;
FRadius := 10;
FAlphaValue := 255;
end;

procedure TCustomRoundShape.SetRadius(Value: Integer);
begin
if FRadius <> Value then
begin
FRadius := Value;
Invalidate;
end;
end;

procedure TCustomRoundShape.SetAlphaValue(Value: Integer);
begin
if FAlphaValue <> Value then
begin
FAlphaValue := Value;
Invalidate;
end;
end;

procedure TCustomRoundShape.Paint;
var
GPPen: TGPPen;
GPColor: TGPColor;
GPGraphics: IGPGraphics;
GPSolidBrush: IGPSolidBrush;
GPGraphicsPath: IGPGraphicsPath;
begin
GPGraphicsPath := TGPGraphicsPath.Create;
GPGraphicsPath.Reset;
GPGraphicsPath.AddArc(0, 0, FRadius, FRadius, 180, 90);
GPGraphicsPath.AddArc(ClientWidth - FRadius - 1, 0, FRadius, FRadius, 270, 90);
GPGraphicsPath.AddArc(ClientWidth - FRadius - 1, ClientHeight - FRadius - 1,
FRadius, FRadius, 0, 90);
GPGraphicsPath.AddArc(0, ClientHeight - FRadius - 1, FRadius, FRadius, 90, 90);
GPGraphicsPath.CloseFigure;

GPColor.InitializeFromColorRef(ColorToRGB(Color));
GPColor.Alpha := FAlphaValue;
GPPen := TGPPen.Create(GPColor);
GPSolidBrush := TGPSolidBrush.Create(GPColor);

GPGraphics := TGPGraphics.Create(Canvas.Handle);
GPGraphics.SmoothingMode := SmoothingModeAntiAlias;
GPGraphics.FillPath(GPSolidBrush, GPGraphicsPath);
GPGraphics.DrawPath(GPPen, GPGraphicsPath);
end;

procedure Register;
begin
RegisterComponents('Stack Overflow', [TRoundShape]);
end;

end.

结果(应用 SmoothingModeAntiAlias 平滑模式):

enter image description here

可以说,使用 GDI+ 来处理这么小的事情是一项很大的开销,但纯 GDI 渲染没有抗锯齿,这使得结果看起来很难看。下面是使用纯 GDI 渲染的相同圆角矩形的示例:

enter image description here

关于delphi - 如何使 TFrame 具有圆角?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11675374/

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