2011-09-28 77 views
3

如何繪製一條線?此代碼不顯示任何內容:Windows XP上的FireMonkey Canvas.DrawLine

var my_point_1, my_point_2: tPointF; 

Canvas.Stroke.Color := claBlue; 
Canvas.Stroke.Kind:= tBrushKind.bkSolid; 

my_point_1.X:= 100; 
my_point_1.Y:= 100; 
my_point_2.X:= 120; 
my_point_2.Y:= 150; 

Canvas.BeginScene; 
Canvas.DrawLine(my_point_1, my_point_2, 1.0); 
Canvas.EndScene; 

的Windows XP Service Pack 3的(tOsVersion.ToString是 「5.1版,版本2600,32位版」,安裝德爾福XE2更新1)

+0

我在Win 7 x64下測試你的代碼並且工作正常,但是在Win XP的虛擬機上失敗。你使用虛擬機來測試代碼嗎? – RRUZ

+2

順便說一句歡迎來到StackOverflow,我希望你留在這裏一段時間來分享你的知識。 :) – RRUZ

+0

RRUZ:謝謝你的歡迎。關於XP,不,它是一個XP平方的簡單PC上它 –

回答

3

你想到這很簡單 - 就像我一樣。但事實並非如此。這些是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

+0

謝謝,BitmapChanged應放在EndScene(XE2 Update4)之後。 –