2012-07-26 18 views
9

मैं (गोल कॉर्नर पृष्ठभूमि बैठक के लिए) TLMDShapeControl के साथ एक TFrame के आधार पर एक घटक बनाना चाहते है और एक TEdit नियंत्रण (कि यह भी एक TComboBox या एक TDBEdit और इतने पर हो सकता है)। उसके बाद मैं इसे पुन: प्रयोज्य घटक नियंत्रण में बदलने के लिए "पैलेट में जोड़ें" कमांड का उपयोग करूंगा।गोलाकार कोनों के साथ टीएफआरएम कैसे बनाएं?

समस्या यह है कि मैं यह चौड़ाई लचीला होने की जरूरत है और इसके लिए मैं फ्रेम alClient अंदर सब कुछ बारी के विचार और TEdit 5 के साथ पिक्सेल मार्जिन तो उपयोगकर्ता गोलाकार कोनों को देख सकते हैं किया था।

यह भयानक था क्योंकि मैं Align का उपयोग नहीं कर सकता और दूसरे के शीर्ष में घटक सेट कर सकता हूं। अब मुझे हर बार घटकों को प्रतिलिपि बनाना और पेस्ट करना होगा! : -। (((

एक ही रास्ता मैं देख रहा हूँ सही बात alClient और 5px मार्जिन और कोई TShape के साथ ही TEdit उपयोग करने के लिए है इसके बजाय मैं TFrame कर सकता है पारदर्शिता के साथ गोल कोने है, इसलिए ऐसा नहीं होगा अलग अलग रंग या TImages की पर बदसूरत देखो।

लेकिन मुझे लगता है कि कैसे करते हो?

किसी को भी किसी भी कोड का नमूना है?

this is the goal: transparent rounded corners

+2

यदि मैं यह ठीक से काम करने, मैं अपने ही नियंत्रण है कि मैं एक पैकेज के रूप में स्थापित करते हैं, कि बाहरी शामिल करना चाहते हैं चाहता था और यहाँ एक ही दौर आयत शुद्ध GDI का उपयोग करके गाया का उदाहरण है आंतरिक नियंत्रण, और वह सभी कोड शामिल है जिसे मैं इसे सभी काम करना चाहता हूं। 'TFrame' सही मूल वर्ग नहीं है। मैं एक सादा 'TCustomControl' का उपयोग करता हूं। फ़्रेम संकलन समय के बजाय डिज़ाइन-टाइम पर दृश्य नियंत्रण की संरचना के लिए हैं। लेकिन अपने स्वयं के कस्टम नियंत्रण को संकलित करना अधिक विश्वसनीय और लचीला समाधान है। –

+1

मैंने ठीक से ऐसा किया है, 'TLMDShapeControl' के बजाय निर्मित TShape का उपयोग करके और यह ठीक काम करता है। लेकिन अंत में, मैंने इन शैलियों को त्याग दिया, क्योंकि मेरे ग्राहक इन गैर देशी शैलियों से नफरत करते हैं और चाहते थे कि वे चले जाएं। –

+0

हां, 'टीशिप' को गोल कोने किया जा सकता है, लेकिन आउटपुट बहुत छोटी है। मेरे पास एक चालक दल नहीं है, इसलिए मैं वह हूं जो आवश्यकताओं की जांच करता है, परियोजना, कोड और सिस्टम के डिजाइन और मेरी परियोजनाओं का डेटाबेस बनाता है और मुझे इनमें से किसी एक में विशेषज्ञ बनने की संभावना नहीं थी चीजें ... अभी तक! :-) – PSyLoCKe

उत्तर

13

गोलाकार कोनों के साथ फ्रेम बनाने के लिए अपने प्रश्न का उत्तर देने के लिए आप इस तरह कुछ कोशिश कर सकते हैं, लेकिन परिणाम के साथ आप असंतुष्ट होंगे क्योंकि 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 किसी भी समारोह है कि चाप प्रतिपादन के लिए एंटीलायज़िंग़ का समर्थन करेगा नहीं है, मैं यहाँ पोस्ट किया है एक दौर आयत आकार (सिर्फ एक शुद्ध भरा का एक उदाहरण गोल आयताकार) जो जीडीआई + का उपयोग करता है (इसके लिए आपको जीडीआई + रैपर from here की आवश्यकता होगी)।

निम्नलिखित गुण इसके उपयोग के लिए महत्वपूर्ण हैं:

  • रंग - आकार भरण रंग है
  • त्रिज्या (कलम रंग, ढाल आदि का बढ़ाया जा सकता है) - (पिक्सेल में) त्रिज्या है गोलाकार कोनों
  • 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 antialiasing क्या परिणाम बनाता है बिना प्रस्तुत करना बदसूरत लग रहा है।

enter image description here

+0

जो मेरे प्रश्न का उत्तर देता है। मैं एक घटक बनाने की कोशिश करूंगा जिसमें हम गोलाकार आकार से ऊपर की तरह नियंत्रण का चयन कर सकते हैं और देख सकते हैं कि यह tframe तरीके से बेहतर है या नहीं। धन्यवाद! – PSyLoCKe

+0

आपका स्वागत है! लेकिन मुझे आपको चेतावनी देना है; यदि आप उपरोक्त टिप्पणी में उल्लिखित 'TCustomControl 'तरीके का पालन करेंगे, तो पारदर्शिता से सावधान रहें। मैं कंटेनर नियंत्रण बनाने की कोशिश कर रहा हूं (उदाहरण के लिए 'टीपीनल' उदाहरण के लिए) पारदर्शी है जब विंडोज थीम अक्षम हैं, लेकिन यह कभी संतोषजनक नहीं रहा है। – TLama

+0

मैंने एंटीअलाइज्ड राउंड कोनों के साथ एक आकृति घटक का एक उदाहरण जोड़ा है ... – TLama

संबंधित मुद्दे