Delphi:在DBGrid中放置一个复选框(主题化)

Delphi:在DBGrid中放置一个复选框(主题化),delphi,checkbox,themes,dbgrid,Delphi,Checkbox,Themes,Dbgrid,我使用以下代码在DBGrid中显示一个复选框。它可以(至少是预期的)使用主题和非主题VCL风格 (在XE2、XE7和柏林测试): 它工作正常,但当我移动到行上时,样式会变得“奇怪”,如下面所示: 有什么帮助吗? 谢谢。经过一些尝试和研究,我自己设法调整了这个方法,只添加了以下几行: if not (gdFocused in State) then Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight)

我使用以下代码在DBGrid中显示一个复选框。它可以(至少是预期的)使用主题和非主题VCL风格 (在XE2、XE7和柏林测试):

它工作正常,但当我移动到行上时,样式会变得“奇怪”,如下面所示:

有什么帮助吗?
谢谢。

经过一些尝试和研究,我自己设法调整了这个方法,只添加了以下几行:

  if not (gdFocused in State) then
    Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight);
这里我分享完整的方法。它可能对某人有用:-)


FillRect看起来不对。这不应该让主题服务绘制父背景吗?
  if not (gdFocused in State) then
    Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight);
uses Vcl.Themes;

procedure CheckBoxGrid(FieldName: String; ValueCheck: Variant; Grid: TDBGrid; const Rect: TRect; Column: TColumn; State: TGridDrawState);
const
  CtrlState: Array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
  CtrlStateXP: Array[Boolean] of TThemedButton = (tbCheckBoxUncheckedNormal, tbCheckBoxCheckedNormal);
var
  R: TRect;
  Details: TThemedElementDetails;
begin
  if Column.FieldName = FieldName then
  begin
    Column.Title.Alignment := taCenter;
    Column.Alignment := taCenter;
    Grid.Canvas.FillRect(Rect);

    if StyleServices.Enabled then
    begin
      Details := StyleServices.GetElementDetails(CtrlStateXP[Column.Field.Value = ValueCheck]);
      StyleServices.DrawElement(Grid.Canvas.Handle, Details, Rect);

      if not (gdFocused in State) then
        Grid.Canvas.Brush.Color := StyleServices.GetSystemColor(clHighlight);
    end
    else
    begin
      R := Rect;
      InflateRect(R, -2, -2);
      DrawFrameControl(Grid.Canvas.Handle, R, DFC_BUTTON, CtrlState[Column.Field.Value = ValueCheck]);
    end;
  end;
end;​