当你有一个 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.pasDefaultDrawColumnCell
中的代码只是绘制文本。很明显,如果你自己接管所有的绘图代码,你应该做更多的事情。但是,内置在 Grids.pas 中的高亮绘图代码(DBGrids.pas 所依赖的)并非旨在从该上下文中调用。我不知道我是否应该直接调用DrawCellHighlight
(如上所示),并找出 Col 和 Row 值,或者我是否应该编写自己的复杂版本的 TCustomGrid.DrawCellHighlight 来手动处理所有各种情况。
当然,这很简单,很明显,我只是忽略了它。请注意,我必须关闭 DefaultDrawing,因此我必须完全从我的所有者绘制事件中进行绘制,并且我必须能够在主题服务不可用时运行,并且我必须在主题服务可用时使用它们。所以我需要直接调用 TCustomGrid.DrawCellHighlight (我不知道怎么做),或者我需要完全重新实现它。