2013-10-19 93 views
-1

繪製矩形有了這個代碼,我想畫一個矩形:用帆布

procedure TForm1.Button1Click(Sender: TObject); 
var rectangle:Trect; 
begin 
    fx:=400; 
    fy:=400; 
    sc1:=base/fx; 
    sc2:=altezza/fy; 
    sc:=max(sc1, sc2); 
    lx:=fx*sc; 
    ly:=fy*sc; 
    xc:=base/2; 
    yc:=altezza/2; 
    x1:=xc-(lx/2); x2:=xc+(lx/2); y1:=yc-(ly/2); y2:=yc+(ly/2); 
    panel1.Repaint; 
    panel1.Canvas.Brush.color:= clblack; 
    panel1.Canvas.line((panel1.width div 2),0,(panel1.Width div 2), panel1.Height); 
    panel1.Canvas.line(0,(panel1.height div 2), panel1.Width,(panel1.Height div 2)); 
    panel1.canvas.brush.style:=bsclear; 
    Rectangle:=rect(x1, y1, x2, y2); 
end; 

但是有一個問題,因爲我只使用整數值。

是否可以使用實數值繪製一個帶有TCanvas的矩形?

+0

在您的邏輯座標系和屏幕座標系之間轉換。 –

+0

坦克,但...我該怎麼做? –

+1

我已經回答了這個問題之前在SO:http://stackoverflow.com/a/16778075/282848 –

回答

2

簡單的答案是否定的。由TCanvas表示的圖形設備使用具有整體座標的座標系。如果您的座標是真實值,那麼您需要在座標系和積分設備座標之間使用某種形式的映射。

但是,在這種情況下,它看起來並不那麼複雜。您本身不需要實際值的座標。你只有真正的價值,因爲你使用真正的分工。也許你所需要做的就是使用整數除法,而不是真正的除法。或者你可能更喜歡Round。

更大的問題是您的代碼位於錯誤的地方。你不能在按鈕處理程序中繪製。 Windows不會記得你畫的是什麼。下次窗口失效時,它會要求面板自行刷新,並且您的矩形將消失。繪畫代碼需要位於重寫Paint方法或等同內部。也許你需要一個油漆盒控制。

+0

始終保持存儲,使用,計算和以其原始實際值實現的實際值,並且只在繪製時將它們縮放到整數值,這仍然是一種很好的做法。 –

+0

@JerryDodge是的,這是映射。 –

+0

剛剛發現,應該強調的是,唯一承擔整體座標的時間就是畫布畫的那一刻。 –