当TDBGrid.DefaultDrawing为false时,如何正确绘制Full Row Selected TDBGrid?

时间:2012-02-27 16:47:48

标签: delphi vcl dbgrid

如果你有一个TDBGrid,全行选择,并且总是显示选择,即使没有聚焦,你想完全拥有它,你可以选择一个已弃用的事件OnDrawDataCell和一个新的事件DrawColumnCell,我选择后者并试试这个:

procedure TDbGridTestForm.mygridDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if  gdSelected in State then begin
      //      mygrid.DrawCellHighlight(Rect, State, Col, Row);
  mygrid.Canvas.Brush.Color := clHighlight;
  mygrid.Canvas.Font.Color := clHighlightText;
  mygrid.Canvas.FillRect(Rect);
  end;


  mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

让我发疯的是,我不会使用DefaultDrawColumnCell代码绘制焦点指示(高亮颜色和焦点矩形),我确信我应该调用DrawCellHighlight而不是执行上面的FillRect hack 。

如果我打开DefaultDrawing,我会得到一组毛刺(奇怪的字体绘画问题),如果我将其关闭,我会得到另一组毛刺(即使在gdSelected时也没有突出显示)。

DBGrids.pas DefaultDrawColumnCell中的代码除了绘制文本外什么也没做。很明显,如果你自己接管所有绘图代码,你应该做更多。但是,DBGrids.pas所依赖的Grids.pas中内置的高亮绘图代码并非设计为从此上下文调用。我无法弄清楚我是否应该直接调用DrawCellHighlight(如上所示),并计算Col和Row值,或者我是否应该编写自己复杂版本的TCustomGrid.DrawCellHighlight来处理所有手动各种情况。

当然这很简单,很明显,我只是忽略它。我必须关闭DefaultDrawing,因此我必须完全从我的所有者绘制事件中绘制,并且我必须能够在主题服务不可用时运行,并且我必须在主题服务可用时使用它们。所以我需要直接调用TCustomGrid.DrawCellHighlight(我不知道如何),或者我需要完全重新实现它。

2 个答案:

答案 0 :(得分:4)

由于您需要自己实现的主题支持,最好调用DrawCellHighlight。即使没有向OnDrawColumnCell提供行号,它看起来也不像DefaultDrawColumnCell代码那样,所以你不必尝试在内部计算它:

type
  tHackGrid = class(tDBGrid);

procedure TTDbGridTestForm.myGridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if gdSelected in State then begin
    tHackGrid(mygrid).DrawCellHighlight(Rect, State, Column.Index, 0);
  end;
  mygrid.DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

答案 1 :(得分:0)

type
  tHackGrid = class(tDBGrid);

procedure MyForm.MyDbGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var ImageIndex: integer;
begin
  if gdSelected in State
  then tHackGrid(Sender).DrawCellHighlight(Rect, State, Column.Index, 0)
  else tHackGrid(Sender).DrawCellBackground(Rect, Column.Color, State, Column.Index, 0);
  TDbGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;