2016-08-02 34 views
1

我正在使用drawgrid來顯示「地下城」地圖。我有一個數組填充了描述每個單元格中的物理特徵類型的數據。房間和走廊的基本佈局等。每個排列都有一個PNG。需要將PNG繪製到Delphi XE6中的指導TDrawGrid

我試圖通過在drawgrid的每個單元中繪製相應的PNG來「繪製」地圖。我可以或多或少地直接使用DrawGrid1.Canvas.Draw(x,y,pngImage),但找出像素中的確切x,y因爲網格線而令人沮喪(至少,我發現它令人沮喪),我不確定我還會遇到什麼其他問題。

我也試過pngImage.Draw(DrawGrid1.Canvas,矩形),但再一次,我要計算矩形,這確實似乎是不必要的細胞和PNG格式都是40×40像素。

閱讀相關文章和示例,OnDrawCell似乎是一種更好的方式,因爲給定ARow和ACol,給定單元格的Rect顯然是預先計算好的(除非我誤解了我在幾處讀過的內容)。但是我發現的例子都沒有顯示OnDrawCell是如何觸發的。簡單的回答「當某些東西被拉進一個單元格中」並不能很好地解釋它。 這就是我正在嘗試做什麼。

(我經常發現這是用Delphi的文檔的情況:你給用例是如何解釋的(並不總是完全一致),但何時或爲什麼離開籠罩在神祕面紗...)

中當然,還有其他一些事情要弄清楚,比如控制拉格柵,以便在單元格點擊時不會擦除PNG。

任何相關的建議將不勝感激。 TFRM

+1

OnDrawCell在需要繪製單元格時觸發,您引用的簡單答案不正確。當一個單元需要被繪製時,由操作系統決定,但你可以強制它這樣做。 –

+0

爲什麼不在OnDrawCell中畫出你的PNG?我想我不明白這個問題。 –

+0

我想我不明白OnDrawCell。我使用網格的唯一原因是,在繪製PNG後,用戶可以單擊相鄰(連接)的單元以「移動」到它們。我大概可以將它們全部繪製到TImage或其他東西上。 你是說我可以在畫布上「畫」而沒有任何特別的目的,只是爲了讓OnDrawCell着火,讓真正的繪畫發生?如上所述,問題不是如何,而是何時或爲什麼。 – Pete

回答

-1

爲什麼要精確地計算像素X和Y這麼難?其實很簡單。

爲了獲得矩形的左邊框,只需將列的寬度加上網格線的寬度乘以列數即可。如果第一列的左邊有網格線,則添加網格線的寬度。

並且爲了獲得您的矩形的右邊界,只需將列的寬度添加到先前的結果。

以及計算y您只需要使用高度而不是寬度

因此,代碼會看起來像這樣(從我的腦海裏寫的和未經測試)

const 
    CellWidth = 40; 
    CellHeight = 40; 
    GridLineThickness = 1; 

procedure DrawCell(Row, Column: Integer; Image: Bitmap); 
var Rect: TRect; 
begin 
    Rect.Left := ((CellWidth + GridLineThickness) * Column) + GridLineThickness; 
    Rect.Right := Rect.Left + CellWidth; 
    Rect.Top := ((CellHeight + GridLineThickness) * Row) + GridLineThickness; 
    Rect.Bottom := Rect.Top + CellHeight; 
    PaintBox1.Canvas.StretchDraw(Rect, Image); 
end; 

如果你想放大的能力放大或縮小隻需將CellWidth和CellHeight乘以縮放係數即可。當縮小很多時,只需省略渲染網格線。