15

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

4

5 回答 5

26

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

于 2011-05-05T22:02:43.027 回答
6

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

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

于 2011-05-05T21:37:40.710 回答
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.
于 2019-01-02T12:34:49.780 回答
0

不太喜欢这两种解决方案,这就是我为阻止您遇到的问题所做的事情。您无需牺牲 Windows 主题即可使其正常工作:

只需检查:

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

并设置表单的颜色,然后再将其显示在选项卡上。

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


ThemeServices 在themes.pas

于 2013-12-02T16:13:28.200 回答
0

如果您希望将 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);
于 2018-07-14T01:09:15.560 回答