首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以更改TTabSheet选项卡的颜色

是否可以更改TTabSheet选项卡的颜色
EN

Stack Overflow用户
提问于 2012-02-18 19:57:52
回答 1查看 4.8K关注 0票数 4

我运行的是Lazarus 0.9.30.2。我有一台上面有TPageControl的TForm。在TPageControl中有一系列的TTabSheets (大约30个)。我想做的是对标签进行颜色编码,因此前10个标签是红色的,接下来的10个标签是蓝色的,最后10个标签是绿色的。我在intranet上看到过代码片段,当你点击它们并导航到它们(以突出显示活动的标签)时,它们会改变标签页的颜色(包括标签本身),但我想要做的是在第一次加载标签页时如上所述地对它们进行着色。

有没有办法做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-21 22:14:34

如果这足以让你有一点棘手的解决方案,只能在禁用了主题的视窗系统上工作,那么可以尝试以下方法:

取消选中Project / Project Options ...项目设置对话框中的Use manifest file to enable themes (Windows only)选项,并将以下代码粘贴到带有页面控件的单元中。它使用插入的类,因此它只能在粘贴此代码的单元中工作。

代码语言:javascript
复制
uses
  ComCtrls, Windows, LCLType;

type
  TPageControl = class(ComCtrls.TPageControl)
  private
    procedure CNDrawItem(var Message: TWMDrawItem); message WM_DRAWITEM;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end; 

implementation

procedure TPageControl.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    if not (csDesigning in ComponentState) then
      Style := Style or TCS_OWNERDRAWFIXED;
  end;
end;

procedure TPageControl.CNDrawItem(var Message: TWMDrawItem);
var
  BrushHandle: HBRUSH;
  BrushColor: COLORREF;
begin
  with Message.DrawItemStruct^ do
  begin
    case itemID of
      0: BrushColor := RGB(235, 24, 33);
      1: BrushColor := RGB(247, 200, 34);
      2: BrushColor := RGB(178, 229, 26);
    else
      BrushColor := ColorToRGB(clBtnFace);
    end;
    BrushHandle := CreateSolidBrush(BrushColor);
    FillRect(hDC, rcItem, BrushHandle);
    SetBkMode(hDC, TRANSPARENT);
    DrawTextEx(hDC, PChar(Page[itemID].Caption), -1, rcItem, DT_CENTER or 
      DT_VCENTER or DT_SINGLELINE, nil);
  end;
  Message.Result := 1;
end;

下面是它的样子(丑陋:)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9340940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档