2014-11-24 3 views
0

Delphi XE에 관한 빠른 질문.델파이 투명한 배경 구성 요소

투명한 배경을 가진 맞춤형 원 모양 구성 요소를 만들려고합니다. 양식에 추가 할 때 구성 요소가 다른 구성 요소와 겹칠 수 있습니다. Brush.Style:=bsTransparent; 또는 ellipse() 이상을 시도했지만 가장자리 영역을 투명하게 만들 수있는 방법을 찾지 못했습니다.

어쨌든 다른 lib 또는 api를 사용하지 않고 구성 요소의 가장자리 영역을 투명하게 만들 수 있습니까?

+0

예를 들어 ExtCtrls.TShape를 사용해 보셨습니까? (TGraphicControl이 적절한 경우) – MBo

+2

TGraphicControl은 부모의 캔버스에 페인트하므로 단추 나 패널과 같은 창 컨트롤을 그릴 수 없습니다. TWinControl 하위 항목은 투명 할 수 없지만 원을 그리기 전에 그 아래에있는 항목을 페인팅하여 위조 할 수 있습니다. WM_ERASEBACKGROUND도 처리해야합니다. 아니면 결코 사용하지 못했지만 상속받을 수있는 클래스가 있습니다. 트릭을 수행하는 것처럼 보입니다 : TCustomTransparentControl. 그것을 사용하는 방법에 대한 자세한 내용은 http://stackoverflow.com/questions/6682396/transparent-tcustomcontrol을 참조하십시오. –

답변

5

그럼 빠른 답변을 드리겠습니다.

type 
    TEllipticPanel = class(Vcl.ExtCtrls.TPanel) 
    procedure CreateWnd; override; 
    procedure Paint; override; 
    procedure Resize; override; 
    procedure RecreateHRGN; 
end; 

    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    panl: TEllipticPanel; 
    public 
    { Public declarations } 
    end; 

implementation 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    panl := TEllipticPanel.Create(self); 
    panl.Left := 10; 
    panl.Top := 10; 
    panl.Width := 100; 
    panl.Height := 50; 
    panl.ParentBackground := False; 
    panl.ParentColor := False; 
    panl.Color := clYellow; 
    panl.Parent := self; 
end; 

{ TEllipticPanel } 

procedure TEllipticPanel.RecreateHRGN; 
var 
    hr: hRgn; 
begin 
    inherited; 
    hr := CreateEllipticRgn(0,0,Width,Height); 
    SetWindowRgn(Handle, hr, True); 
end; 

procedure TEllipticPanel.CreateWnd; 
begin 
    inherited; 
    RecreateHRGN; 
end; 

procedure TEllipticPanel.Paint; 
begin 
    inherited; 
    Canvas.Brush.Style := bsClear; 
    Canvas.Pen.Style := TPenStyle(psSolid); 
    Canvas.Pen.Width := 1; 
    Canvas.Pen.Color := clGray; 
    Canvas.Ellipse(1,1,Width-2,Height-2); 
end; 

procedure TEllipticPanel.Resize; 
begin 
    inherited; 
    RecreateHRGN; 
end; 

키는 Windows CreateEllipticRgn 및 GDI SetWindowRgn 기능입니다.

Windows 영역에 대한 자세한 내용은 Regions을 참조하십시오.

+1

패널의 'Handle'을 다시 만들 때마다'SetWindowRgn()'을 호출해야합니다. –

+0

@RemyLebeau 감사합니다. 하지만 오래된 hRgn이 유출 되었습니까? 아니면 Windows가 처리합니까? –

+3

[documentation] (http://msdn.microsoft.com/en-us/library/dd145102.aspx) 당 : "** SetWindowRgn에 대한 호출이 성공한 후 시스템은 region 핸들에 지정된 영역을 소유합니다. hRgn * *.이 시스템은 영역의 복사본을 만들지 않으므로이 영역 핸들을 사용하여 더 이상 함수 호출을해서는 안됩니다. ** 특히이 영역 핸들을 삭제하지 마십시오. 시스템은 더 이상 영역 핸들을 삭제하지 않습니다. 필요합니다. ** " –