2012-11-14 2 views
1

나는 델파이 7로 작성된 어딘가에있는 드로잉 소프트웨어의 소스 코드를 가지고있다.이 코드는 꽤 코드 크기가 크다. 해당 소프트웨어로 그리는 모든 것은 단색이며 투명성이 없습니다. 대부분의 코드를 읽으려고하면 그리기에 사용되는 주요 구성 요소가 TCanvas라는 것을 알게되었습니다. 투명성이 허용되도록 TCanvas를 쉽게 설치할 수 있습니까? 감사.Delphi TCanvas에서 반투명 rect를 소개하는 방법은 무엇입니까?

+1

이를하지 않고 투명한 선택을 그리는 예를 들어 것 http://www.progdigy.com/?page_id=7

에서 가져온 할 수있다 꽤 일반적인 질문입니다. 투명성과 드로잉은 광범위한 주제입니다. 아마도 조금 좁힐 수 있을까요? –

+0

기존 코드에서 페인팅을 투명하게 그려야합니까? 무엇에? – NGLN

답변

3

투명도는 캔버스에 문제가 아니며 그림의 문제점입니다. 계층화 된 창을 제외하고 wincontrol을 실제로 투명하게 만들 수있는 방법은 없습니다. 이것이 질문이라면 모든 캔버스에 투명도로 칠할 수 있습니다. 예 : 당신은 GDI +를 사용할 수 투명성 쉽게 페인트 작업을 수행하려면

Canvas.Draw(0,0,png1); 
Canvas.Draw(0,0,png2); 

는이 방법이 추가적으로 librarays

unit Unit3; 
// 20121108 by Thomas Wassermann 
interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, ExtCtrls, jpeg; 

type 
    TForm3 = class(TForm) 
    Image1: TImage; 
    PaintBox1: TPaintBox; 
    procedure FormCreate(Sender: TObject); 
    procedure PaintBox1Paint(Sender: TObject); 
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    private 
    { Private-Deklarationen } 
    FDownPoint, FCurrentPoint: TPoint; 
    public 
    { Public-Deklarationen } 
    end; 

var 
    Form3: TForm3; 

implementation 

uses Math; 
{$R *.dfm} 

procedure TForm3.FormCreate(Sender: TObject); 
begin 
    PaintBox1.BringToFront; 
end; 

type 
    pRGBQuadArray = ^TRGBQuadArray; 
    TRGBQuadArray = ARRAY [0 .. $EFFFFFF] OF TRGBQuad; 

Procedure SetAlpha(bmp: TBitMap; Alpha: Byte; R: TRect); 
var 
    pscanLine32: pRGBQuadArray; 
    i, j: Integer; 
begin 
    bmp.PixelFormat := pf32Bit; 
    bmp.HandleType := bmDIB; 
    bmp.ignorepalette := true; 
    bmp.alphaformat := afDefined; 
    for i := 0 to bmp.Height - 1 do 
    begin 
    pscanLine32 := bmp.Scanline[i]; 
    for j := 0 to bmp.Width - 1 do 
    begin 
     if (j >= R.Left) and (j <= R.Right) and (i >= R.Top) and (i <= R.Bottom) then 
     begin 
     pscanLine32[j].rgbReserved := 0; 
     pscanLine32[j].rgbBlue := 0; 
     pscanLine32[j].rgbRed := 0; 
     pscanLine32[j].rgbGreen := 0; 
     end 
     else 
     begin 
     pscanLine32[j].rgbReserved := Alpha; 
     pscanLine32[j].rgbBlue := Alpha; 
     pscanLine32[j].rgbRed := Alpha; 
     pscanLine32[j].rgbGreen := Alpha; 
     end; 
    end; 
    end; 
end; 

procedure TForm3.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
    FDownPoint.X := X; 
    FDownPoint.Y := Y; 
    FCurrentPoint := FDownPoint; 
    PaintBox1.Invalidate; 
end; 

procedure TForm3.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
    if ssLeft in Shift then 
    begin 
    FCurrentPoint.X := X; 
    FCurrentPoint.Y := Y; 
    PaintBox1.Invalidate; 
    end; 
end; 

procedure TForm3.PaintBox1Paint(Sender: TObject); 
var 
    bmp: TBitMap; 
    SelRect: TRect; 
begin 
    bmp := TBitMap.Create; 
    try 
    bmp.Width := PaintBox1.Width; 
    bmp.Height := PaintBox1.Height; 
    if (FCurrentPoint.X = FDownPoint.X) and (FCurrentPoint.Y = FDownPoint.Y) then 
     SelRect := PaintBox1.BoundsRect 
    else 
    begin 
     SelRect.Left := Min(FCurrentPoint.X, FDownPoint.X); 
     SelRect.Top := Min(FCurrentPoint.Y, FDownPoint.Y); 
     SelRect.Right := Max(FCurrentPoint.X, FDownPoint.X); 
     SelRect.Bottom := Max(FCurrentPoint.Y, FDownPoint.Y); 
    end; 
    SetAlpha(bmp, 140, SelRect); 
    PaintBox1.Canvas.Draw(0, 0, bmp); 
    finally 
    bmp.Free; 
    end; 
end; 

end. 
+0

답장을 보내 주셔서 감사합니다. 하지만 코드를 수정할 수는 없다고 생각합니다. 컨테이너가 TCustomControl이고 캔버스가 TCanvas라는 것을 알고 있습니다. 내가 할 수있는 일은 소프트웨어가 광산 캔버스를 대신 사용할 수 있도록 TCanvas를 상속하는 것입니다. 그렇게하는 방법을 사십시오? PaintBox, BitMap 등의 구성 요소를 추가 할 수 없습니다. – user1285419

+0

이것이 가능할 것이라고 나는 생각하지 않는다. Canvas는 개인 FCanvas를위한 읽기 전용 Proprty이다. – bummi

관련 문제