Köşeleri yuvarlatılmış köşelerle nasıl oluşturulacağını sormak için böyle bir şey deneyebilirsiniz, ancak burada kullanılan CreateRoundRectRgn
hiçbir antialiasing olmadığı için sonuçtan memnun kalmayacaksınız.
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;
Güncelleme: GDI ark render için antialiasing destekleyecek herhangi bir işlev olmadığından
, burada gönderdiniz yuvarlak dikdörtgen şeklin (dolgulu sadece saf bir örnek yuvarlak dikdörtgen) GDI + kullanır (bunun için GDI + sarmalayıcılarına ihtiyacınız olacak from here
).
Aşağıdaki özellikler kullanımı için önemlidir:
- Color - şekil dolgu renk
- Radius (kalem rengi, gradyan vb geliştirilebilir) - (piksel) yarıçapıdır yuvarlatılmış köşeler
- AlphaValue çizmek için kullanılır dairenin -
:-) eğlence için işlenen yuvarlak dikdörtgen (opaklık değeridir
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.
Ve sonuç (SmoothingModeAntiAlias
yumuşatma modu uygulanmış):
biri böyle küçücük şey için + GDI kullanmak için büyük bir havai olduğunu söyleyebiliriz ama saf GDI sonuçlarını kılan antialiasing olmadan işlemek çirkin görünüyor.Biliyorum bu dış içeren bir paket olarak yüklemek kendi kontrolünü yapmak istiyorum, düzgün çalışmak istediğini ve varsa
: Burada saf GDI kullanarak işlenen aynı yuvarlak dikdörtgenin örneğidir iç kontrol, ve tüm çalışmasını sağlamak istediğim tüm kodu içerir. “TFrame” doğru ebeveyn sınıfı değil. Düz bir "TCustomControl" kullanırdım. Çerçeveler, derleme süresinden ziyade tasarım zamanında görsel kontrollerin bileşimi içindir. Ama kendi özel kontrolünüzü derlemek daha güvenilir ve esnek bir çözümdür. –
Tam olarak bunu yaptım, TLMDShapeControl' yerine yerleşik TShape kullanarak ve iyi çalıştı. Ama sonunda, bu tarzları terk ettim, çünkü müşterilerim bu yerel olmayan stillerden nefret ediyor ve gitmelerini istiyordu. –
Evet, "TShape" köşesi yuvarlatılabilir, ancak çıktı çok yorucu. Bir ekibim yok, bu yüzden gereksinimleri araştıran, projeyi, sistemin kodunu ve tasarımını ve projelerimin veri tabanını araştıran biriyim ve bunlardan birinde uzman olma şansım olmadı. şeyler ... henüz! :-) – PSyLoCKe