Как я могу изменить цвет фона моего TTabSheets?
Я проектирую форму с Delphi 2009, и я пытаюсь выяснить элемент TPageControl. Я пытаюсь сделать отдельные диалоги для каждой вкладки. Я могу создать TTabSheets и поместить свои элементы в TabSheets, но моя проблема в том, что они видны как ячмень, так как фон по умолчанию для TTabSheet выглядит белым. Я пытался разместить панель на TabSheet, но по какой-то причине панель всегда появляется за TabSheet. Итак, мой вопрос: есть ли способ изменить цвет листа вкладок на стандартные окна бежевого цвета, или это способ разместить TPanel на вкладке, достигая той же цели?
4 ответа
Установите свойство стиля в tsFlatButtons
Фон ~color~ вернется к красивому clBtnFace
Стандартный цвет Windows для листа вкладок - белый. Этот стандарт появился, когда были представлены темы XP. Если пользователь переключится обратно на Windows Classic, он получит серый фон. [Вы имеете в виду серый, а не бежевый, не так ли? Беж был бы действительно мерзким!]
Панель внутри вкладки никогда не может находиться за страницей, поскольку она находится внутри страницы. На самом деле происходит прозрачная отрисовка панели, поэтому преобладает стандартный цвет листа вкладки.
Используйте этот блок в вашей форме на интерфейсе:
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.
Мне не нравится ни одно из решений, это то, что я делаю, чтобы помешать вашей проблеме. Вам не нужно жертвовать темами Windows, чтобы заставить его работать:
просто проверьте:
if ThemeServices.ThemesEnabled then
FormBGColor := clBtnHighlight
else
FormBGColor := clBtnFace;
и установите цвет формы, прежде чем показывать ее на вкладках.
(лично мне никогда не нравилось это решение, но именно так была запрограммирована основная часть программы, над которой я работаю до того, как я начал, так что чтобы это не выглядело как дерьмо на терминальных серверах моего компьютера XOR, это то, что я должен был сделать)
ThemeServices находится в themes.pas
Если вы хотите сохранить свойство 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);