[英]Delphi - Drawing to the canvas of a selected cell in a string grid - possible?
我想在字符串網格中繪制單元格的畫布。 這將在預先加載到字符串網格中的圖像之上。
目前,我沒有在圖像上繪圖,而是加載第二個透明圖像,然后在單元格頂部繪畫。 這是我使用的代碼,它的工作原理。
procedure TfrmCavern.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
index : integer;
I : integer;
begin
// Calculate the corresponding linear index
index := LinearIndexOf(ARow, ACol);
//Draw image referenced to cell
StringGrid.Canvas.StretchDraw(Rect, CellDetails[index].Images.Picture.Graphic);
//if player present draw corresponding player image
for I := 0 to frmWelcome.NoofPlayers - 1 do
begin
if index = Players[I].pIndex then StringGrid.Canvas.StretchDraw(Rect,Players[I].UserImage.Picture.Graphic);
end;
end;
end;
該過程首先繪制參考單元格的圖像。 如果有“玩家”存在,則會將玩家的棋子畫在上面。 因為“播放器片段”圖像是透明的.PNG圖像,所以下面的原始圖像仍然可見。
該方法的缺點是由於圖像是恆定的,“播放器塊”處於單元內的設定位置。 我希望能夠根據選擇的單元格在單元格內的不同位置繪制“播放器塊”。 我有大約200個單元格,所以我真的不想手動創建具有不同位置的許多圖像。
我已經嘗試直接繪制到drawcell過程中的stringgrid的畫布,但它似乎引用整個stringgrid而不是正在繪制的當前單元格。
StringGrid.Canvas.ellipse(10,10,50,50);
我看了,但我似乎無法引用當前單元格的畫布 - 我認為它不存在?
我嘗試的下一件事是繪制臨時圖像,然后將圖像繪制到單元格。
TempImage.Canvas.Ellipse(10,10,50,50);
StringGrid.Canvas.StretchDraw(Rect, TempImage.Picture.Graphic);
這在一定程度上起作用,它確實將圖像繪制到單元格,但是圖像具有不透明的背景/畫布,因此單元格是白色的,其上有圓圈,下方的圖像不可見。 我做了一些研究,但找不到一種方法來使圖像的畫布透明。
我能想到的最后一件事就是編寫一個算法來定位當前單元格的左上角,然后從那里直接繪制到畫布,但這可能是泥濘的,並且在重繪stringgrid時會產生問題。
任何人都能看到我的問題嗎?
先謝謝你,喬希
控件的畫布只有一個畫布。 每個單元格只是該畫布內的一個矩形。 在畫布中找到當前單元格的位置是微不足道的。 實際上,這就是Rect
參數的用途。 Rect.Left
是單元格的x坐標, Rect.Top
是單元格的y坐標。
還是我誤解了你的問題?
OnDrawCell的Rect
參數指定特定單元格相對於網格客戶端坐標系的邊界。 所以你需要繪制到這個矩形內的坐標。 在事件處理程序中嘗試這樣的事情:
StringGrid.Canvas.Pen.Color := clBlack;
StringGrid.Canvas.Brush.Style := bsClear;
StringGrid.Canvas.Ellipse(
Rect.Left+5,
Rect.Top+5,
Rect.Left+15,
Rect.Top+15
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.