你想到這很簡單 - 就像我一樣。但事實並非如此。這些是FireMonkey的早期版本,而Embarcadero似乎對這些反饋感到不知所措。
在TForm上直接使用畫布時,必須接受結果是易失性的,即它會在第一次重繪(調整大小,其他窗口重疊等)時消失。
這對我的作品在幾臺機器:
創建一個新的FM-HD項目中,添加按鈕和處理程序:
procedure TForm1.Button1Click(Sender: TObject);
var pt0,pt1 : TPointF;
begin
pt0.Create(0,0);
pt1.Create(100,50);
Canvas.BeginScene;
Canvas.DrawLine(pt0,pt1,1);
Canvas.EndScene;
end;
運行,點擊按鈕,(希望):瞧!
在一個的TImage畫布,但是,它是稍微複雜(讀:越野車)
創建一個新的項目,這兩個時間TButtons和TImage中 - 集(左,上)喜歡的東西(150,150 )區分它的Canvas和TForm的Canvas。
添加該代碼,並分配給處理器(雙擊表格和按鈕):
procedure TForm1.FormCreate(Sender: TObject);
begin
// Without this, you normally get a runtime exception in the Button1 handler
Image1.Bitmap := TBitmap.Create(150,150);
end;
procedure TForm1.Button1Click(Sender: TObject);
var pt0,pt1 : TPointF;
begin
pt0.Create(0,100);
pt1.Create(50,0);
with Image1.Bitmap do begin
Canvas.BeginScene;
Canvas.DrawLine(pt0,pt1,1);
BitmapChanged; // without this, no output
Canvas.EndScene;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
// This demonstrates that if you try to access the Canvas of the TImage object (and NOT its bitmap)
// you are sometimes defaulted to the Canvas of the Form (on some configurations you get the line directly on the form).
var pt0,pt1 : TPointF;
begin
pt0.Create(0,100);
pt1.Create(50,0);
with Image1 do begin
Canvas.BeginScene;
Canvas.DrawLine(pt0,pt1,1);
Canvas.EndScene;
end;
end;
最後一點:一旦你開始使用位圖的掃描線特性發揮,確保你做在BeginScend/EndScene部分之外 - 在完成之後,製作一個「dummy」BeginScend/EndScene部分以確保您的更改不會丟失:-( 如有必要,我可能會回到此處; o)
祝你好運! Carsten
我在Win 7 x64下測試你的代碼並且工作正常,但是在Win XP的虛擬機上失敗。你使用虛擬機來測試代碼嗎? – RRUZ
順便說一句歡迎來到StackOverflow,我希望你留在這裏一段時間來分享你的知識。 :) – RRUZ
RRUZ:謝謝你的歡迎。關於XP,不,它是一個XP平方的簡單PC上它 –