TChromeTabs 优化改进
已知未解决问题
- 全屏时当窗体失去焦点,则会显示出未绘制完成的原标题栏(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 优化改进的更多相关文章
- 美团分布式ID生成框架Leaf源码分析及优化改进
本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...
- 冒泡排序(Bubble Sort),比较次数优化改进
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 记录下push推送优化改进点
一)自主研发的push服务的特点及优势: 1) 消息回执确认(ack); 2) 有效期推送(设置消息的有效期); 3) 精准推送(设置设备组别推送); 4) 下发任务分解(拆分任务,多进程); 5) ...
- 如何写出高质量的Python代码--做好优化--改进算法点滴做起
小伙伴你的程序还是停留在糊墙吗?优化代码可以显示程序员的素质欧! 普及一下基础了欧: 一层for简写:y = [1,2,3,4,5,6],[(i*2) for i in y ] 会输出 ...
- IntelliJ IDEA 2021.3 正式发布:支持远程开发、IDE故障排查等多项优化改进
作者:程序猿DD 博客:https://blog.didispace.com/ 昨天刚刚跟大家聊了Jetbrains即将推出轻量级编辑器Fleet,以挑战 VS Code的消息,今天又收到了Intel ...
- P1011 传纸条//dp优化改进状态表示
P1011 传纸条 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2008复赛提高组第三题 描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不 ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 多软件系统集成缓存体系改进
由于我们同时开发多个大型应用系统同时系统有大量用户.高并发用户,平时访问系统的用户数量就有3万多人在线.需要对几十个系统进行持续优化改进,同时要增强信息系统的各种安全性. 如此多的系统.如此多的用户, ...
- HBase设计与开发性能优化(转)
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...
随机推荐
- LeetCode: pow
Title: https://leetcode.com/problems/powx-n/ 思路:二分.使用递归或者非递归.非递归有点难理解.pow(0,0)=1 递归的方法是将n为负数的用除法解决.有 ...
- RTP/RTCP(一)-H264关于RTP协议的实现
H264关于RTP协议的实现2010-07-22 13:35完整的C/S架构的基于RTP/RTCP的H.264视频传输方案.此方案中,在服务器端和客户端分别进行了功能模块设计.服务器端:RTP封装模块 ...
- TCP/IP详解学习笔记(14)-TCP连接的未来和性能(未写完)
在TCP刚出世的时候,其主要工作环境是以太网和SLIP之类的低速网络.随着高速网络的出现,让TCP协议的吞吐量更大,效率更高的要求就愈来愈迫切.为此,TCP增加了三个重要机制来对应现在的变化,他们是 ...
- w3c盒子模型与ie盒子模型
盒子模型是css的专有名词,用来描述页面设置中的各种属性,如内容(content).填充(padding).边框(border).边界(margin),由于这些属性拼在一起,与日常生活中的“盒子”很相 ...
- HDU 5882 Balanced Game
Balanced Game Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- [Papers]NSE, $\p_3u$, Lebesgue space [Cao, DCDSA, 2010]
$$\bex \p_3\bbu\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=2,\quad \frac{27}{16}\leq q\le ...
- Conversion to Dalvik format failed: Unable to execute dex: null
[2013-11-19 14:18:48 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Check th ...
- POJ 3321- Apple Tree(标号+BIT)
题意: 给你一棵树,初始各节点有一个苹果,给出两种操作,C x 表示若x节点有苹果拿掉,无苹果就长一个. Q x查询以x为根的子树中有多少个苹果. 分析: 开始这个题无从下手,祖先由孩子的标号不能确定 ...
- cocos2d CCLayer 触摸相关
要让一个 CCLayer 能够接受触摸输入 需要进行如下设置: [selfsetTouchEnabled:YES]; cocos2d-x提供了两种触摸事件处理机制, 分别是CCStandardTo ...
- 【LeetCode 229】Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...