自定义皮肤很方便,基础开发的工作也是很大的。不过还好一般产品真正需要开发的并不是很多。现在比较漂亮的界面产品都会有个大大的工具条。

Toolbar工具条实现皮肤的方法还是可以使用Form的处理方案。每当重复写相同东西的时候,有时会感觉无聊。所以想简单实现个轻量级的,依葫芦画瓢进行减肥。

 

完成后大致的效果

窗体皮肤实现 - 实现简单Toolbar(六)

这个简易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;
保存Action信息

相关文章:

  • 2022-01-11
  • 2022-12-23
  • 2022-01-29
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-04
相关资源
相似解决方案