已知未解决问题

  • 全屏时当窗体失去焦点,则会显示出未绘制完成的原标题栏(Fixed);
  • 处于非 Areo 效果下时,窗体标题栏需要定制。
  • 新增按钮上的 Hint 提示后再移至其它标签,将无法重新提示。

1、解决全屏时未重新计算 ChromeTabs 占有的客户区问题。

全屏时 TChromeTabsGlassForm 窗体仍然会为 ChromeTabs 保留一个位置,因此,需要修改如下代码(在 ChromeTabsGlassForm.pas):

procedure TChromeTabsGlassForm.AdjustClientRect(var Rect: TRect);
begin
  inherited;

  if ShowTabsInTitleBar then
    Inc(Rect.Top, GlassFrame.Top);
end;

为如下代码

procedure TChromeTabsGlassForm.AdjustClientRect(var Rect: TRect);
begin
  inherited;

  if ShowTabsInTitleBar and ChromeTabs.Visible then
    Inc(Rect.Top, GlassFrame.Top);
end;

解决启动时窗体最大化时,左边有一白色竖线问题(未更新),需要修改 ChromeTabsGlassForm.pas 文件如下代码:

procedure TChromeTabsGlassForm.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
  if ShowTabsInTitleBar and ChromeTabs.Visible then
  begin
    if WindowState = wsMaximized then
      Inc(Message.CalcSize_Params.rgrc[].Left, FWndFrameSize + )
    else
      Inc(Message.CalcSize_Params.rgrc[].Left, FWndFrameSize);

    Dec(Message.CalcSize_Params.rgrc[].Right, FWndFrameSize);
    Dec(Message.CalcSize_Params.rgrc[].Bottom, FWndFrameSize);
  end
  else
    inherited;
end;

为如下代码:

procedure TChromeTabsGlassForm.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
  if ShowTabsInTitleBar and ChromeTabs.Visible then
  begin
    if WindowState = wsMaximized then
      Inc(Message.CalcSize_Params.rgrc[].Left, FWndFrameSize)
    else
      Inc(Message.CalcSize_Params.rgrc[].Left, FWndFrameSize);

    Dec(Message.CalcSize_Params.rgrc[].Right, FWndFrameSize);
    Dec(Message.CalcSize_Params.rgrc[].Bottom, FWndFrameSize);
  end
  else
    inherited;
end;

2、为 TChromeTab 控件增加自定义的图标,而不使用 ImageList。

首先是 ChromeTabsClasses.pas

IChromeTabs 接口定义,增加如下接口方法,用于根据 Tab 的索引取得 TChromeTab 对象。尝试过使用 IChromeTab 对象强制转换为 TChromeTab 然后取 Picture 的值,只能取到空值。

function GetTabByIndex(index: integer): TChromeTab;

IChromeTab 接口的定义,增加如下方法。

function GetPicture: TPicture;

TChromeTab 类中增加如下属性和方法

TChromeTab = class(TCollectionItem, IChromeTab)
private
    FPicture: TPicture;
    function GetPicture: TPicture;
    procedure SetPicture(const Value: TPicture);
public
    constructor Create(Collection: TCollection); override; //要增加内容
    destructor Destroy; override; //要增加内容
published
property Picture: TPicture read FPicture write SetPicture;
end;

增加的相关代码

constructor TChromeTab.Create(Collection: TCollection);
begin
  FCollection := Collection;
  FImageIndex := -;
  FImageIndexOverlay := -;
  FVisible := TRUE;
  FPicture := TPicture.Create; //此行新增。

  // Inherited needs to be here so the property values are
  // set before it is called
  inherited;

//  GetChromeTabInterface.TabCreate(Self);
end;

destructor TChromeTab.Destroy;
begin
//  GetChromeTabInterface.TabDestroy(Self);
  FPicture.Free; //此行新增。
  inherited;

  if FTabControl <> nil then
    FTabControl.Free;
end;

procedure TChromeTab.SetPicture(const Value: TPicture);
begin
  FPicture.Assign(Value);
end;

function TChromeTab.GetPicture: TPicture;
begin
  Result := FPicture;
end;

ChromeTabs.pas 文件,修改 TCustomChromeTabs 类,增加新方法如下

function TCustomChromeTabs.GetTabByIndex(index: integer): TChromeTab;
begin
  Result := FTabs[index];
end;

ChromeTabsControls.pas 文件,修改 CalculateRects 方法内容如下:

procedure TChromeTabControl.CalculateRects(var ImageRect, TextRect,
  CloseButtonRect, CloseButtonCrossRect: TRect;
  var NormalImageVisible, OverlayImageVisible, SpinnerVisible, TextVisible: Boolean);
var
  LeftOffset, RightOffset, ImageWidth, ImageHeight: Integer;
  //xiefang Added.
  tab: TChromeTab;
begin
  ...//关键是增加这个条件,以免图标位置计算错误以及不显示图标。
  tab := ChromeTabs.GetTabByIndex(ChromeTab.GetIndex);  //xiefang added.
  NormalImageVisible := Assigned(tab.Picture.Graphic) and (not tab.Picture.Graphic.Empty); //xiefang added.
  if not NormalImageVisible then //xiefang added.
    NormalImageVisible := ImageVisible(ChromeTabs.GetImages, ChromeTab.GetImageIndex);
  OverlayImageVisible := ImageVisible(ChromeTabs.GetImagesOverlay, ChromeTab.GetImageIndexOverlay);
  SpinnerVisible := (ChromeTab.GetSpinnerState <> tssNone) and (not (csDesigning in ChromeTabs.GetComponentState));
 ...

end;

TChromeTabControl.DrawTo 方法中嵌套方法 DrawImage() 修改如下

procedure DrawImage(Images: TCustomImageList; ImageIndex: Integer; ImageRect: TRect; ChromeTabItemType: TChromeTabItemType);
  var
    ImageBitmap: TGPImage;
    Handled: Boolean;
    tab: TChromeTab;//Xiefang Add. 2016-05-30
  begin
    ChromeTabs.DoOnBeforeDrawItem(TabCanvas, ImageRect, ChromeTabItemType, ChromeTab.GetIndex, Handled);

    if not Handled then
    begin
      tab := ChromeTabs.GetTabByIndex(ChromeTab.GetIndex); //Xiefang Add. 2016-05-30
      if Assigned(tab.Picture.Graphic) and (not tab.Picture.Graphic.Empty) then //Xiefang Add. 2016-05-30
      begin
        //Xiefang Add. 2016-05-30
        ImageBitmap := GraphicToGPBitmap(tab.Picture.Graphic);
      end
      else
      begin
        ImageBitmap := ImageListToTGPImage(Images, ImageIndex);
      end;
      try
        TabCanvas.DrawImage(ImageBitmap, ImageRect.Left, ImageRect.Top);
      finally
        FreeAndNil(ImageBitmap);
      end;
    end;

    ChromeTabs.DoOnAfterDrawItem(TabCanvas, ImageRect, ChromeTabItemType, ChromeTab.GetIndex);
  end;

ChromeTabsUtils.pas 中,增加公共方法如下

function GraphicToGPBitmap(Graphic: TGraphic): TGPBitmap;
var
  MemStream: TMemoryStream;
begin
  MemStream := TMemoryStream.Create;
  try
    Graphic.SaveToStream(MemStream);

    MemStream.Position := ;
  except
    FreeAndNil(MemStream);

    raise;
  end;

  Result := TGPBitmap.Create(TStreamAdapter.Create(MemStream, soOwned));
end;

大功告成。设置 ChromeTab 中的 Picture 属性为一个图标即可显示。

TChromeTabs 优化改进的更多相关文章

  1. 美团分布式ID生成框架Leaf源码分析及优化改进

    本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...

  2. 冒泡排序(Bubble Sort),比较次数优化改进

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  3. 记录下push推送优化改进点

    一)自主研发的push服务的特点及优势: 1) 消息回执确认(ack); 2) 有效期推送(设置消息的有效期); 3) 精准推送(设置设备组别推送); 4) 下发任务分解(拆分任务,多进程); 5) ...

  4. 如何写出高质量的Python代码--做好优化--改进算法点滴做起

    小伙伴你的程序还是停留在糊墙吗?优化代码可以显示程序员的素质欧! 普及一下基础了欧: 一层for简写:y = [1,2,3,4,5,6],[(i*2) for i in y ]       会输出  ...

  5. IntelliJ IDEA 2021.3 正式发布:支持远程开发、IDE故障排查等多项优化改进

    作者:程序猿DD 博客:https://blog.didispace.com/ 昨天刚刚跟大家聊了Jetbrains即将推出轻量级编辑器Fleet,以挑战 VS Code的消息,今天又收到了Intel ...

  6. P1011 传纸条//dp优化改进状态表示

    P1011 传纸条 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不 ...

  7. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  8. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 多软件系统集成缓存体系改进

    由于我们同时开发多个大型应用系统同时系统有大量用户.高并发用户,平时访问系统的用户数量就有3万多人在线.需要对几十个系统进行持续优化改进,同时要增强信息系统的各种安全性. 如此多的系统.如此多的用户, ...

  9. HBase设计与开发性能优化(转)

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...

随机推荐

  1. 【Java集合框架】规则集--Set

    集合: Java主要支持三种: 1.规则集(Set) 用于存储一组不重复的元素 2.线性表(List) 用于存储一个由元素构成的有序集合 3.队列(Queue) 同与数据结构中的队列,存储用先进先出的 ...

  2. H264相关知识

    1.基本概念 I frame :帧内编码帧 又称intra picture,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象 ...

  3. 构建属于自己的ORM框架之二--IQueryable的奥秘

    上篇文章标题乱起,被吐槽了,这次学乖了. 上篇文章中介绍了如何解析Expression生成对应的SQL语句,以及IQueryable的一些概念,以及我们所搭建的框架的思想等.但还没把它们结合并应用起来 ...

  4. windows远程连接linux桌面---使用tightvnc或者tigervnc

    一.安装tightvnc: tightvnc的安装在安装包中有详细的说明(README文件) 首先你要确保linux已经安装jpeg和zlib库, 2.编译 执行如下两个命令: [root@local ...

  5. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(3)

    运行ElasticSearch(Running ElasticSearch) 让我们运行我们的第一个实例.转到bin目录并从命令行运行以下命令: ./elasticsearch –f (Linux o ...

  6. HDU-3001 Travelling

    http://acm.hdu.edu.cn/showproblem.php?pid=3001 从任何一个点出发,去到达所有的点,但每个点只能到达2次,使用的经费最小.三进制 Travelling Ti ...

  7. hdu5073 简单枚举+精度处理

    其实这题还是挺简单的,因为移动k个星球后,这k个星球的权值就可以变为0,所以只有剩下的本来就是连着的才是最优解,也就是说要动也是动两端的,那么就O(N)枚举一遍动哪些就好了. 我是在杭电oj题目重现的 ...

  8. 【LeetCode 213】House Robber II

    This is an extension of House Robber. After robbing those houses on that street, the thief has found ...

  9. 一个可序列化的C#对象,如何转成一个XML格式的文件或字符串【转】

    原文:http://blog.csdn.net/otong/article/details/7894059 序列化或反序列化成一个字符串: 方法一: 序列化: public static string ...

  10. 一行命令实现Android自动关机

    前几天晚上失眠,实在睡不着觉,于是想用Nexus7听一听小野丽莎的歌,在安静祥和之中睡去(怎么感觉有点...)但是不能让平板总是这么循环播放吧(屋里吐槽Google Play Music),所以在平板 ...