【发布时间】:2015-02-13 01:26:14
【问题描述】:
我正在尝试在此面板的过程中在 TPanel 的画布上绘制图像。当我在 Panel 的 Paint Method 中执行此操作时,它工作得很好,但是当我尝试在另一个过程或构造函数中绘制 Canvas 时,什么也没有发生。
这就是我在绘制过程中在面板的画布上绘制的方式:
procedure TFeld.Paint;
var bmp : TBitmap;
begin
inherited;
bmp := TBitmap.Create;
try
bmp.LoadFromFile('textures\ground.bmp');
self.Canvas.Draw(0,0,bmp);
finally
bmp.Free;
end;
end;
这就是我尝试在另一个过程中使用它的方式:
procedure TFeld.setUnsichtbar;
var bmp : TBitmap;
begin
bmp := TBitmap.Create;
try
bmp.LoadFromFile('textures\invisible.bmp');
self.Canvas.Draw(0,0,bmp);
finally
bmp.Free;
end;
end;
但是 Panel 的 Canvas 仍然是我在 Paint 过程中应用的图像。
我已经尝试将绘图从 Paint 过程移到 Constructor 中,但没有成功。
路径也正确,切换路径,现在面板有了“invisible.bmp”图像。
全班/单位:http://pastebin.com/YhhDr1F9
知道为什么这不起作用吗?
【问题讨论】:
-
因为所有的绘图都需要在
OnPaint中完成,而在其他地方尝试这样做是行不通的,因为当Paint事件发生时,它会撤消您在窗口或其他地方所做的一切面板上漆。这相当于“医生,我这样做的时候很痛。”医生回答“所以不要再那样做了。”。当您在OnPaint以外的地方绘制时它不起作用,解决方案是停止在OnPaint以外的地方绘制。 -
我会从 Petzold 的书开始,了解 InvalidateRect 和 WM_PAINT