2015-03-16 2 views
0

Отредактировано: Я хочу нарисовать вертикальную центре Ticon графических и текстовых на TJvDBGrid (Jedi потомок проекта из TDBGrid). Я попытался отключить метод DefaultDrawing для JvDBGrid и переопределить его, но я мог только заполнить ячейки черным (я думаю, что мой код неполный, чтобы выполнить переопределение).Как рисовать Vertical По центру Содержимое на DBGrid

Теперь я succeeded нарисовать значок на ячейке, а текст остается неизменным с рисунком по умолчанию. Как я могу центрировать значок (вертикальный и горизонтальный) и текст (только вертикальный), например this?

Вот мой код:

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; 
+0

Можете ли вы сказать нам, что вы пробовали до сих пор пожалуйста. –

+0

Какие «ошибки» вы получили? Какая версия Delphi? Каковы эти «несколько способов», которые вы пробовали? Я не вижу больших усилий, чтобы обеспечить нам достаточно возможностей для работы. –

+0

На скриншоте, я вижу, что изображение сосредоточено, но не текст. Это противоречит вашему вопросу, предъявляющему два разных требования. Кроме того, что VCL Styles имеет отношение ко всему? Ваш скриншот также не использует их. –

ответ

0

После многих испытаний, я нашел решение переходящего различные учебники по Интернету. На 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