사용 : Delphi XE2, VCL 32 비트 응용 프로그램, Windows 8TFrame의 캔버스에 액세스하는 방법?
내 프레임의 배경을 (OnPaint 이벤트를 노출하므로 TJvPanel을 사용하고 있습니다.) 패널에 페인트하려고합니다. 프레임의 자식 제어.
this post을 읽고 필드로 캔버스를 추가 한 후에도 나는 아직 성공적이지 않습니다.
ShowAddReceiptPanel을 호출하면 ProEffectImage 메서드로 처리 한 후 그레이 스케일링 된 전경 패널에 이미있는 모든 컨트롤 (격자 및 페이지 컨트롤 포함)이있는 프레임의 (TfrmMyFrame) 창 내용을 그릴 수 있지만 대신 불투명 한 흰색 배경을 보여줍니다. 내가 놓친 게 있니? 당신이 당신의 캔버스 핸들에 할당
type
TfrmMyFrame = class(TFrame)
pnlHdr: TPanel;
pnlAddNewBG: TJvPanel;
procedure pnlAddNewBGPaint(Sender: TObject);
private
{ Private declarations }
FBGImg: TProEffectImage;
Fcnvs: TCanvas;
procedure PaintWindow(DC: HDC); override;
procedure ShowAddReceiptPanel;
procedure HideAddReceiptPanel;
procedure ResizePanel_pnlAddNewBG;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
constructor TfrmMyFrame.Create(AOwner: TComponent);
begin
inherited;
FBGImg := TProEffectImage.Create(nil);
Fcnvs := TCanvas.Create;
end;
destructor TfrmMyFrame.Destroy;
begin
if Assigned(FBGImg) then
FBGImg.Free;
if Assigned(Fcnvs) then
Fcnvs.Free;
inherited;
end;
procedure TfrmMyFrame.ShowAddReceiptPanel;
begin
ResizePanel_pnlAddNewBG;
pnlAddNewBG.Visible := True;
end;
procedure TfrmMyFrame.PaintWindow(DC: HDC);
begin
inherited;
Fcnvs.Handle := DC;
end;
procedure TfrmMyFrame.pnlAddNewBGPaint(Sender: TObject);
var
l, t, w, h: Integer;
srct, drct: TRect;
begin
// Copy Frame canvas to BGImg bitmap
l := 0;
t := pnlHdr.Height;
w := ClientWidth;
h := ClientHeight - t;
srct := TRect.Create(l, t, w, h);
FBGImg.Width := w;
FBGImg.Height := h;
drct := TRect.Create(l, t, w, h);
FBGImg.Canvas.CopyMode := cmSrcCopy;
FBGImg.Canvas.CopyRect(drct, Fcnvs, srct);
// FBGImg.Picture.SaveToFile('c:\tmp\a.bmp');
FBGImg.Effect_AntiAlias;
FBGImg.Effect_GrayScale;
// Draw BGImg onto Option panel
TJvPanel(Sender).Canvas.CopyMode := cmSrcCopy;
TJvPanel(Sender).Canvas.Draw(0, 0, FBGImg.Picture.Graphic);
end;
procedure TfrmMyFrame.ResizePanel_pnlAddNewBG;
var
x1, y1, x2, y2: Integer;
bmp: TBitmap;
begin
x1 := 0;
y1 := pnlHdr.Height;
x2 := ClientWidth;
y2 := ClientHeight - y1;
pnlAddNewBG.SetBounds(x1, y1, x2, y2);
end;
소멸자의 if 할당 테스트를 제거 할 수 있고 제거해야합니다. 포함 된 Free를 호출하면됩니다. –
감사! 무료로 배정 된 수표가 포함되어 있습니다 - 언제 그 기능을 소개 했습니까? –
Er, Delphi 1에서. 나는 이것을 다음과 같이 참조한다 : http://stackoverflow.com/questions/8548843/why-should-i-not-use-if-assigned-before-using-or-freeing-things/8550628 # 8550628 –