【问题标题】:How can I change the background color of my TTabSheets?如何更改 TTabSheets 的背景颜色?
【发布时间】:2011-05-05 21:35:00
【问题描述】:

我正在使用 Delphi 2009 设计一个表单,并且我试图找出 TPageControl 元素。我试图为每个选项卡制作单独的对话框。我可以制作 TTabSheet,也可以将元素放在 TabSheets 上,但我的问题是它们是大麦可见的,因为 TTabSheet 的默认背景似乎是白色的。我试图在 TabSheet 上放置一个面板,但无论出于何种原因,面板总是出现在 TabSheet 后面。所以我的问题是:有什么方法可以将标签页的颜色更改为标准的 windows 米色,或者他们是否可以在标签页上放置一个 TPanel 以实现相同的目标?

【问题讨论】:

  • 当我看到一个使用选项卡控件(带有选项卡)的对话框时,其中的页面是clBtnFace 彩色的,我想,“哦,这是一个古老而丑陋的应用程序,早在出现之前就编写好了的主题”。但是,如果我理解正确,您不想将选项卡控件用作“普通”选项卡控件,并且选项卡可见。相反,您希望在对话框中有几个“页面”(但没有标签!),不是吗?也许您想在对话框底部添加“下一步”和“返回”按钮?在其他方面你想创建一个wizard
  • @Andreas 你肯定误解了,虽然我承认我对此很陌生,可能解释不正确。

标签: delphi tpagecontrol


【解决方案1】:

将样式属性设置为 tsFlatButtons
背景~color~将恢复为漂亮的clBtnFace

【讨论】:

  • +1 我不知道。那是因为 tsFlatButtons 是老派吗?
  • 嗯,你也可以设置成tsButtons。 (选项为tsTabstsButtonstsFlatButtons。)这将完全禁用选项卡控件的视觉主题。主题仅适用于普通标签。
  • 这个技巧+1。真的应该是 -1 来形容 clBtnFace 漂亮(反正不是 XP Luna 蓝色)
  • +1,我最近在维护一些我们无法启用主题的旧应用程序时发现了这一点。
  • 这似乎只在选项卡位置为 tpTop 时才有效(至少使用 Delphi 10.2)。在我的情况下,我在 tpBottom 也有选项卡位置,然后当我尝试将样式更改为 tsTabs 以外的任何内容时,它给了我一个例外:“选项卡样式与当前选项卡位置不兼容”。
【解决方案2】:

标签页的标准 Windows 颜色是白色。当引入 XP 主题时,该标准应运而生。如果用户切换回 Windows 经典版,那么他们将获得灰色背景。 [你的意思是灰色而不是米色,不是吗?米色真的很丑!]

标签页内的面板永远不能位于页面后面,因为它位于页面内部。实际发生的情况是面板被透明地绘制,因此标准选项卡颜色占主导地位。

【讨论】:

  • @David,颜色可以改成蓝色吗?还是我们坚持使用默认颜色?哦,对结构窗格 +1。
  • @Johan 我确信通过一些努力可以改变颜色。我猜你需要破解页面控件和可能的其他一些控件。我想说的是,如果 OP 想要标准行为,那么它就是白色的。
  • @David,我是自己问的 :-(
  • 要使面板使用自己的背景,请在TPanel 上设置ParentBackground := false
  • 听起来像是非 ms-windows-common-controls-tabsheet 的工作。
【解决方案3】:

在界面的表单中使用这个单元:

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.

【讨论】:

  • 有了这个我可以得到我的 tsTabs 的背景,将 tpBottom 标签页定位到 clBtnFace。焦点选项卡指示器(“选项卡”)仍然是白色的,但看起来不太一样。旧版本是使用 Delphi 6 制作的,新版本是 10.2。旧版本中的选项卡(和按钮)比新版本“更 3D”,新版本更扁平。
【解决方案4】:

不太喜欢这两种解决方案,这就是我为解决您遇到的问题而采取的措施。您无需牺牲 Windows 主题即可使其正常工作:

检查一下:

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

并在将表单显示在选项卡上之前设置表单的颜色。

(就我个人而言,我从不喜欢这个解决方案,但这是我工作程序的主要部分在我开始之前是如何编程的,所以为了让它看起来不像我的计算机 XOR 终端服务器上的废话,这是我必须做的)


ThemeServices 在themes.pas 中

【讨论】:

  • FormBGColor 定义在哪里?
  • @MehmetFide 抱歉,我无法回答这个问题,因为我无法再访问 Delphi,您可能需要自己问。
【解决方案5】:

如果您希望将 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);

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2018-02-13
    • 2012-01-02
    • 2022-01-21
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多