2012-07-26 21 views
9

(TLMDShapeControl (yuvarlak köşe arka planı için) ve TEdit denetimi (TComboBox veya TDBEdit vb. Gibi) tabanlı bir bileşen oluşturmak istiyorum. Bundan sonra "Palete Ekle" komutunu Yeniden Kullanılabilir Bileşen Denetimi'ne dönüştürmek için kullanacağım. kiYuvarlak köşeli TFRAme nasıl yapılır?

Sorun esnek genişlik olması gerekir ve bunun için Frame alClient içinde her şeyi açmak fikrini ve kullanıcı yuvarlak köşeler görebilirsiniz TEdit 5 ile piksel marjı vardı.

Çok kötüydü, çünkü Align kullanamıyorum ve bileşenleri bir diğerinin üzerine yerleştiremiyorum. Şimdi, her kullanmamda bileşenleri kopyalayıp yapıştırmam gerekiyor! .: - Ben doğru olanı alClient ve 5px marjı ve hiçbir TShape ile sadece TEdit kullanmaktır bakın Onun yerine şeffaflık ile yuvarlatılmış köşe olmak TFrame yapabiliriz, tek yol (((

yüzden olmaz .

farklı renk veya TImages on çirkin görünecek Ama bunu nasıl yapacağım?

kimse herhangi bir kod örneği var mı?

this is the goal: transparent rounded corners

+2

: 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. –

+1

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. –

+0

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

cevap

13

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ış):

enter image description here

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

enter image description here

+0

Bu, sorumu yanıtlıyor. Yuvarlatılmış şeklin üzerinde istediğimiz kontrol türünü seçebilmemiz ve tframe yolundan daha iyi olup olmadığına bakalım. Teşekkürler! – PSyLoCKe

+0

Rica ederim! Ama seni uyarmalıyım; Örneğin, yukarıdaki yorumda belirttiğim gibi "TCustomControl" yöntemini takip ederseniz, şeffaflığa dikkat edin. Windows temaları devre dışı bırakıldığında konteynır kontrolünü (örneğin, 'TPanel' gibi) şeffaf hale getirmeye çalışıyorum, ama hiçbir zaman tatmin edici olmadı. – TLama

+0

Antialiased yuvarlak köşelere sahip bir şekil bileşeni örneği ekledim ... – TLama

İlgili konular