1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| //------------------------------------------------------------------------------
procedure TDBGridSLTAssistant.DrawCheckBox(const ARect: TRect; AChecked: Boolean; AEnabled: Boolean = True);
var
uState: UINT;
tbState: TThemedButton;
Details: TThemedElementDetails;
StyleColor: TColor;
Buffer: Vcl.Graphics.TBitmap;
BufferRect: TRect;
begin
if StyleServices.Enabled then
begin
// Un bug sur DrawElement d'un TThemedButton dans un DBGrid provoque sur les thèmes foncés une perte de la couleur de fond !
// En attendant une meilleure solution, j'utilise un Buffer temporaire pour dessiner le ThemedButton CheckBox
Buffer := Vcl.Graphics.TBitmap.Create();
try
BufferRect := Rect(0, 0, ARect.Width, ARect.Height);
Buffer.SetSize(BufferRect.Width, BufferRect.Height);
Details := StyleServices.GetElementDetails(tgCellNormal);
StyleServices.GetElementColor(Details, ecFillColor, StyleColor);
// Force un fond opaque pour cacher le texte !
Buffer.Canvas.Brush.Color := StyleColor;
Buffer.Canvas.Brush.Style := bsSolid;
Buffer.Canvas.FillRect(BufferRect);
tbState := tbCheckBoxUncheckedNormal;
if AChecked then
tbState := tbCheckBoxCheckedNormal;
if not AEnabled then
begin
if AChecked then
tbState := tbCheckBoxCheckedDisabled
else
tbState := tbCheckBoxUncheckedDisabled;
end;
Details := StyleServices.GetElementDetails(tbState);
StyleServices.DrawElement(Buffer.Canvas.Handle, Details, BufferRect, BufferRect);
// Dessin final
DBGrid.Canvas.Draw(ARect.Left, ARect.Top, Buffer);
finally
Buffer.Free();
end;
end
else
begin
uState := DFCS_BUTTONCHECK;
if AChecked then
uState := uState or DFCS_CHECKED;
if not AEnabled then
uState := uState or DFCS_INACTIVE;
DBGrid.Canvas.FillRect(ARect);
DrawFrameControl(DBGrid.Canvas.Handle, ARect, DFC_BUTTON, uState);
end;
end; |
Partager