Как я могу изменить цвет фона моего TTabSheets? - PullRequest
14 голосов
/ 06 мая 2011

Я разрабатываю форму с помощью Delphi 2009, и я пытаюсь выяснить элемент TPageControl. Я пытаюсь сделать отдельные диалоги для каждой вкладки. Я могу создать TTabSheets и поместить свои элементы в TabSheets, но моя проблема в том, что они видны как ячмень, так как фон по умолчанию для TTabSheet выглядит белым. Я пытался разместить панель на TabSheet, но по какой-то причине панель всегда появляется за TabSheet. Итак, мой вопрос: есть ли способ изменить цвет листа вкладок на стандартные окна бежевого цвета, или это способ разместить TPanel на вкладке, достигнув той же цели?

Ответы [ 5 ]

23 голосов
/ 06 мая 2011

Установите свойство стиля в tsFlatButtons
Фон ~ color ~ вернется к красивому clBtnFace

6 голосов
/ 06 мая 2011

Стандартный цвет Windows для листа вкладок - белый. Этот стандарт появился, когда были представлены темы XP. Если пользователь переключится обратно на Windows Classic, он получит серый фон. [Вы имеете в виду серый, а не бежевый, не так ли? Беж был бы действительно мерзким!]

Панель внутри вкладки никогда не может находиться за страницей, поскольку она находится внутри страницы. На самом деле происходит прозрачная отрисовка панели, поэтому преобладает стандартный цвет листа вкладки.

1 голос
/ 02 января 2019

Используйте этот блок в вашей форме на интерфейсе:

unit MSCtrlsStyleHook;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.Themes,
  Winapi.CommCtrl;

type
  TTabSheet = class(Vcl.ComCtrls.TTabSheet)
  private
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
  end;

  TPageControl = class(Vcl.ComCtrls.TPageControl)
  private
    procedure TCMAdjustRect(var Msg: TMessage); message TCM_ADJUSTRECT;
  end;

implementation

{ TPageControl }

procedure TPageControl.TCMAdjustRect(var Msg: TMessage);
begin
  inherited;
  if Msg.WParam = 0 then
    InflateRect(PRect(Msg.LParam)^, 3, 3)
  else
    InflateRect(PRect(Msg.LParam)^, -3, -3);
end;

{ TTabSheet }

procedure TTabSheet.WMEraseBkgnd(var Message: TWMEraseBkgnd);
var
  LRect  : TRect;
  LCanvas: TCanvas;
begin
  if (PageControl <> nil) and StyleServices.Enabled and
     ((PageControl.Style = tsTabs) or TStyleManager.IsCustomStyleActive) then
  begin
    //Get the bounds of the Tabsheet
    GetWindowRect(Handle, LRect);
    OffsetRect(LRect, -LRect.Left, -LRect.Top);
    //create a TCanvas for erase the background, using the DC of the message
    LCanvas := TCanvas.Create;
    try
      LCanvas.Handle := Message.DC;
      LCanvas.Brush.Color:= $fafafa;// Color You need;
      LCanvas.FillRect(LRect);
    finally
      LCanvas.Handle := 0;
      LCanvas.Free;
    end;

    Message.Result := 1;
  end
  else
    inherited;
end;

end.
0 голосов
/ 14 июля 2018

Если вы хотите сохранить свойство PageControl Style как tsTabs, вам нужно взломать класс TTabSheet ...

Чуть выше объявления типа вашей формы добавить следующее ...

  TTabSheet = class(ComCtrls.TTabSheet)
  protected
    procedure PaintWindow(DC: HDC); override;
  end;

Затем в разделе реализации модуля ...

  var brushBtnFace: HBrush;

  procedure TTabSheet.PaintWindow(DC: HDC);
  var
    rec: TRect;
  begin
    rec := ClientRect;
    windows.FillRect(DC, rec, brushBtnFace);
  end;

И, наконец, создайте и уничтожьте свою кисть в разделах инициализации и завершения модуля ...

  initialization
    brushBtnFace := CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
  finalization
    DeleteObject(brushBtnFace);
0 голосов
/ 02 декабря 2013

Мне не очень нравится ни одно из решений, это то, что я делаю, чтобы помешать вашей проблеме. Вам не нужно жертвовать темами Windows, чтобы заставить его работать:

просто проверьте:

if ThemeServices.ThemesEnabled then
  FormBGColor := clBtnHighlight
else
  FormBGColor := clBtnFace;

и установите цвет формы, прежде чем показывать ее на вкладках.

(лично мне никогда не нравилось это решение, но именно так была запрограммирована основная часть программы, над которой я работаю до того, как я запустился, поэтому чтобы это не выглядело дерьмом на терминальных серверах моего компьютера XOR, это то, что я должен был сделать )


ThemeServices находится в themes.pas

...