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