Как рисовать вертикально центрированный контент на DBGrid
Отредактировано: я хочу нарисовать TIcon-графику с вертикальным центром и текст на TJvDBGrid (потомок проекта от Jedi TDBGrid). Я попытался отключить метод DefaultDrawing в JvDBGrid и переопределить его, но я мог заполнить только ячейки черным (я думаю, что мой код не завершен для переопределения).
Теперь мне удалось нарисовать значок в ячейке, и текст остался прежним со стандартным рисунком. Как я могу отцентрировать иконку (по вертикали и горизонтали) и текст (по вертикали), как это?
Вот мой код:
procedure TFrmXXX.JvDBGridXXXDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
Icon: TIcon;
fixRect: TRect;
imgWidth: Integer;
begin
fixRect := Rect;
if Column.Index = 0 then //always the first one
begin
Icon := GetIcon; //Returns TIcon object
try
imgWidth := (Rect.Bottom - Rect.Top);
fixRect.Right := Rect.Left + imgWidth;
(Sender as TJvDBGrid).Canvas.StretchDraw(fixRect, Icon);
finally
Icon.Free;
end;
fixRect := Rect;
fixRect.Left := fixRect.Left + imgWidth;
end;
(Sender as TJvDBGrid).DefaultDrawColumnCell(fixRect, DataCol, Column, State);
end;
1 ответ
Решение
После многих испытаний я нашел решение, объединяющее различные учебники в Интернете. На событии DrawColumnCell я написал что-то вроде этого:
Canvas.FillRect(Rect); //Fill the cell using current brush.
И в каждом конкретном случае столбца я использовал один из этих методов:
Canvas.Draw((Rect.Right - Rect.Left - Icon.Width) div 2 + Rect.Left, (Rect.Bottom - Rect.Top - Icon.Height) div 2 + Rect.Top, Icon); //Draw the graphic centered on cell
Canvas.DrawText(Canvas.Handle, PChar(Column.Field.DisplayText), Length(Column.Field.DisplayText), Rect, DT_VCENTER or DT_CENTER or DT_SINGLELINE or DT_NOPREFIX); //Draw vertical and horizontal centered text
Canvas.DrawText(Canvas.Handle, PChar(Column.Field.DisplayText), Length(Column.Field.DisplayText), Rect, DT_VCENTER or DT_SINGLELINE or DT_NOPREFIX); //Draw vertical centered and horizontal left justified text