Пользовательский метод рисования в TSplitter не использует цвета Vcl Styles - PullRequest
3 голосов
/ 30 марта 2012

Я использую код, указанный в этой ссылке TSplitter enhanced with grab bar, чтобы нарисовать панель захвата в элементе управления сплиттером,

procedure TSplitter.Paint;
var
  R: TRect;
  X, Y: integer;
  DX, DY: integer;
  i: integer;
  Brush: TBitmap;
begin
  R := ClientRect;
  Canvas.Brush.Color := Color;
  Canvas.FillRect(ClientRect);

  X := (R.Left+R.Right) div 2;
  Y := (R.Top+R.Bottom) div 2;
  if (Align in [alLeft, alRight]) then
  begin
    DX := 0;
    DY := 3;
  end else
  begin
    DX := 3;
    DY := 0;
  end;
  dec(X, DX*2);
  dec(Y, DY*2);

  Brush := TBitmap.Create;
  try
    Brush.SetSize(2, 2);
    Brush.Canvas.Brush.Color := clBtnHighlight;
    Brush.Canvas.FillRect(Rect(0,0,1,1));
    Brush.Canvas.Pixels[0, 0] := clBtnShadow;
    for i := 0 to 4 do
    begin
      Canvas.Draw(X, Y, Brush);
      inc(X, DX);
      inc(Y, DY);
    end;
  finally
    Brush.Free;
  end;

end;

код работает хорошо, но когда я включилстили vcl, цвета, используемые для рисования сплиттера и панели захвата, не соответствуют используемым стилями vcl.

enter image description here

Как рисовать TSplitter с помощьюVcl стиль цвета текущей темы?

1 Ответ

4 голосов
/ 30 марта 2012

Системные цветовые константы , использующие код (clBtnFace, clBtnHighlight, clBtnShadow), не сохраняющий цвета стилей vcl, необходимо использовать функцию StyleServices.GetSystemColor, чтобы перевести их в vcl стили цвета.

procedure TSplitter.Paint;
var
  R: TRect;
  X, Y: integer;
  DX, DY: integer;
  i: integer;
  Brush: TBitmap;
begin
  R := ClientRect;
  if TStyleManager.IsCustomStyleActive then
    Canvas.Brush.Color := StyleServices.GetSystemColor(clBtnFace)
  else
  Canvas.Brush.Color := Color;

  Canvas.FillRect(ClientRect);

  X := (R.Left+R.Right) div 2;
  Y := (R.Top+R.Bottom) div 2;
  if (Align in [alLeft, alRight]) then
  begin
    DX := 0;
    DY := 3;
  end else
  begin
    DX := 3;
    DY := 0;
  end;
  dec(X, DX*2);
  dec(Y, DY*2);

  Brush := TBitmap.Create;
  try
    Brush.SetSize(2, 2);

    if TStyleManager.IsCustomStyleActive then
      Brush.Canvas.Brush.Color := StyleServices.GetSystemColor(clBtnHighlight)
    else
      Brush.Canvas.Brush.Color := clBtnHighlight;

    Brush.Canvas.FillRect(Rect(0, 0, Brush.Height, Brush.Width));

    if TStyleManager.IsCustomStyleActive then
      Brush.Canvas.Pixels[0, 0] :=  StyleServices.GetSystemColor(clBtnShadow)
    else
      Brush.Canvas.Pixels[0, 0] :=  clBtnShadow;

    for i := 0 to 4 do
    begin
      Canvas.Draw(X, Y, Brush);
      inc(X, DX);
      inc(Y, DY);
    end;
  finally
    Brush.Free;
  end;

end;
...