2017-03-16 74 views
1

我使用下面的代码来显示DBGrid中的复选框。它的工作原理(至少是预期)两个主题和非主题的VCL风格 (在XE2,XE7和柏林测试):德尔福:在DBGrid中放置一个复选框(主题)

uses Vcl.Themes; 

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
    DataCol: Integer; 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 
    CheckBoxRectangle : TRect; 
    Details: TThemedElementDetails; 
begin 
    if Column.Field.DataType = ftBoolean then 
    begin 
    Column.Title.Alignment := taCenter; 
    Column.Alignment := taCenter; 
    TDBGrid(Sender).Canvas.FillRect(Rect); 

    if ThemeServices.ThemesEnabled then 
    begin 
     Details := ThemeServices.GetElementDetails(CtrlStateXP[Column.Field.AsBoolean]); 
     ThemeServices.DrawElement(TDBGrid(Sender).Canvas.Handle, Details, Rect); 
    end 
    else 
    begin 
     CheckBoxRectangle.Left := Rect.Left + 2; 
     CheckBoxRectangle.Right := Rect.Right - 2; 
     CheckBoxRectangle.Top := Rect.Top + 2; 
     CheckBoxRectangle.Bottom := Rect.Bottom - 2; 
     DrawFrameControl(TDBGrid(Sender).Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]); 
    end; 
    end; 
end; 

它的正常工作,除非我搬过来的行,风格变'怪',像波纹管:

​​

任何帮助吗? 谢谢。

+1

FillRect看起来不对。难道不应该让主题服务绘制父级背景? –

回答

1

一些尝试和研究,我已经设法通过自己的适应方法,只需添加以下行后:

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;​