Delphi - Рисование на холсте выделенной ячейки в сетке строк - возможно? - PullRequest
7 голосов
/ 05 марта 2011

Я хочу нарисовать на холсте ячейку в сетке строк.Это будет поверх изображения, предварительно загруженного в сетку строк.

То, что у меня есть

В настоящее время вместо рисования поверх изображения я загружаю второе прозрачное изображениеа затем рисовать на вершине клетки.Это код, который я использую, и он работает.

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.Canvas.ellipse(10,10,50,50);

Я смотрел, но не могу ссылаться на холст текущей ячейкиЯ предполагаю, что его не существует?

Следующее, что я попробовал, это рисование во временное изображение, а затем рисование изображения в ячейке.

TempImage.Canvas.Ellipse(10,10,50,50);
StringGrid.Canvas.StretchDraw(Rect, TempImage.Picture.Graphic);

Это сработалодействительно рисовал изображение в ячейке, однако изображение имело непрозрачный фон / холст, поэтому ячейка была белой с кружком на ней, изображение под ней не было видно.Я провел небольшое исследование, но не смог найти способ сделать холст изображения прозрачным.

Последнее, что я могу придумать, это написать алгоритм для определения местоположения верхней левой точки текущей точки.ячейку, а затем рисуем прямо на холст оттуда, но это может быть сложным и создавать проблемы при перерисовке строки.

Может кто-нибудь увидеть способ обойти мою проблему?

Заранее спасибо, Джош

Ответы [ 2 ]

4 голосов
/ 05 марта 2011

Существует только один холст, холст элемента управления.Каждая ячейка - это просто прямоугольник внутри этого холста.Найти положение текущей ячейки на холсте тривиально.Действительно, для этого и нужен параметр Rect.Rect.Left это координата x ячейки, а Rect.Top это координата y ячейки.

Или я неверно истолковал ваш вопрос?

3 голосов
/ 05 марта 2011

Параметр Rect для OnDrawCell указывает границы конкретной ячейки относительно клиентской системы координат сетки. Поэтому вам нужно нарисовать координаты, которые лежат в этом прямоугольнике. Попробуйте что-то вроде этого в вашем обработчике событий:

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
);
...