gpt4 book ai didi

delphi - 如何访问TFrame的 Canvas ?

转载 作者:行者123 更新时间:2023-12-03 15:54:49 24 4
gpt4 key购买 nike

使用:Delphi XE2、VCL 32位应用程序、Windows 8

我正在尝试将框架的背景绘制到面板上(我正在使用 TJvPanel,因为它公开了 OnPaint 事件),该面板是框架的子控件。

阅读后this post并添加 Canvas 作为字段,我仍然没有成功。

调用 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;

最佳答案

分配给 Canvas 句柄的 DC 仅在 PaintWindow 调用期间有效。当它无效时,您可以在该函数之外使用它,从而导致您观察到的行为。

我认为您应该可以通过调用PaintTo来解决您的问题方法。创建正确大小的位图并将其 Canvas 传递给 PaintTo。

关于delphi - 如何访问TFrame的 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15831932/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com