自定义皮肤很方便,基础开发的工作也是很大的。不过还好一般产品真正需要开发的并不是很多。现在比较漂亮的界面产品都会有个大大的工具条。
Toolbar工具条实现皮肤的方法还是可以使用Form的处理方案。每当重复写相同东西的时候,有时会感觉无聊。所以想简单实现个轻量级的,依葫芦画瓢进行减肥。
完成后大致的效果
这个简易Toolbar只实现了Button样式,没有分割线没有下拉多选之类的样式。
”这么弱的东西有毛用?“
其实这个工具条主要目的是用于附着在其他控件上使用,比如某些控件的标题区域位置。当然如果想要搞的强大,那么代码量肯定会膨胀。
控件实现内容:
1、加入Hint提示
2、加入了简易动画效果,鼠标进入和离开会有个渐变效果。
实现方案
1、基类选用
2、Action的关联
3、绘制按钮
4、鼠标响应
5、美化(淡入淡出简易动画)
OK~完成
一、基类选择
在基类选择上稍微纠结了下。Delphi大家都知道做一个显示控件一般有2种情况,一种是图形控件(VC里叫静态控件),还种种有焦点可交互的。
如果我想做个Toolbar并不需要焦点,也不需要处理键盘输入,TGraphicControl 是比较理想的继承类。不过最终还是使用了TWinControl,主要一点是TWinControl有个句柄方便处理。当然TGraphicControl也是可以申请句柄的。这个问题就不纠结,确定使用TWinControl。
二、关联Action
说是关联其实就是Toolbar有多少个Button,需要保存这些Button的信息。在标题工具栏(四)中已经有简易实现。个人喜欢用Record来记录东西,简单方便不要管创建和释放。
1 TmtToolItem = record 2 Action: TBasicAction; 3 Enabled: boolean; 4 Visible: boolean; 5 ImageIndex: Word; // 考虑到标题功能图标和实际工具栏功能使用不同图标情况,分开图标索引 6 Width: Word; // 实际占用宽度,考虑后续加不同的按钮样式使用 7 Fade: Word; // 褪色量 0 - 255 8 SaveEvent: TNotifyEvent; // 原始的Action OnChange事件 9 end;
这是一个Button的信息,记录了些基本的信息(这个和原来一样)。如果愿意可以加个样式类型(Style),来绘制更多的Button样式。
1 TmtCustomToolbar = class(TWinControl) 2 private 3 FItems: array of TmtToolItem; 4 FCount: Integer; 5 ... ...
FItems 和 FCount 用来记录Button的数组容器。直接使用SetLength动态设置数组的长度,简易不用创建直接使用。有了容器,Action就需要个入口来传入。
处理三件事情:
1、检测容器容量,不够增加
2、清空第Count位的Record值(清零)。这步其实对Record比较重要,如果记录中增加参数值时...给你来个随机数那就比较郁闷了。
3、填充记录
4、重算尺寸并重新绘制
1 procedure TmtCustomToolbar.Add(Action: TBasicAction; AImageIndex: Integer); 2 begin 3 if FCount >= Length(FItems) then 4 SetLength(FItems, FCount + 5); 5 6 // 保存Action信息 7 ZeroMemory(@FItems[FCount], SizeOf(TmtToolItem)); 8 FItems[FCount].Action := Action; 9 FItems[FCount].Enabled := true; 10 FItems[FCount].Visible := true; 11 FItems[FCount].ImageIndex := AImageIndex; 12 FItems[FCount].Width := 20; 13 FItems[FCount].Fade := 0; 14 FItems[FCount].SaveEvent := TacAction(Action).OnChange; 15 TacAction(Action).OnChange := DoOnActionChange; 16 17 // 初始化状态 18 with FItems[FCount] do 19 if Action.InheritsFrom(TContainedAction) then 20 begin 21 Enabled := TContainedAction(Action).Enabled; 22 Visible := TContainedAction(Action).Visible; 23 end; 24 25 inc(FCount); 26 27 // 更新显示尺寸 28 UpdateSize; 29 end;