Windows7新的Taskbar 在 Delphi 2010 中的编程应用
一提到Taskbar相关,首先就想到ITaskBarList不同版本接口.到shlobj单元一看,果然增加了ITaskbarList3,ITaskbarList4两个新版本的接口.
老办法CreateComObject(CLSID_TaskbarList)就行了.返回的是一个ITaskBarList接口.看具体的操作系统,返回的是你操作系统所能支持的最高版本的ITaskBarList.
TaskBar 的 进度条
设计一个窗口
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShlObj, ActiveX, ComObj, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
GroupBox1: TGroupBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox1: TCheckBox;
CheckBox4: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
private
{ Private declarations }
FPos : Int64;
FMax : Int64;
FTaskBarList : ITaskbarList4;
function SetProgressState():Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
SetProgressState();
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FTaskBarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList4;
FPos := 0;
FMax := 200;
SetProgressState();
end;
function TForm1.SetProgressState: Integer;
begin
Result := TBPF_NOPROGRESS;
if CheckBox1.Checked then
Result := Result or TBPF_INDETERMINATE;
if CheckBox2.Checked then
Result := Result or TBPF_NORMAL;
if CheckBox3.Checked then
Result := Result or TBPF_ERROR;
if CheckBox4.Checked then
Result := Result or TBPF_PAUSED;
FTaskBarList.SetProgressState(Handle, Result);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (FPos < FMAX) then
Inc(FPos, 10)
else
FPos := 0;
FTaskBarList.SetProgressValue(Handle, FPos, FMax);
end;
end.
运行看看效果.
不定的:进度颜色的边缘是渐变的
正常的:就是绿色的进度条.
出错的:就是红色的进度条.
暂停的:就是黄色的进度条
TaskBar 的覆盖图标
就是可以再任务栏图标上再覆盖一个小图标,可以用表示状态之类的
新建一个窗口.放置一个ImageList,添加几个icon.再放一个Timer,我们用定时器来不停地变换覆盖图标.如果你的图标设置的足够好,还可以模拟动画效果啊.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShlObj, ActiveX, ComObj, ExtCtrls, StdCtrls, ImgList;
type
TForm1 = class(TForm)
Button1: TButton;
ImageList1: TImageList;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
FTaskBarList : ITaskbarList4;
FIcon : TIcon;
FIconIndex : Integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FTaskBarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList4;
FIcon := TIcon.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FIcon.Free;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if FIconIndex < ImageList1.Count then
begin
Inc(FIconIndex);
end
else
begin
FIconIndex := 0;
end;
ImageList1.GetIcon(FIconIndex, FIcon);
FTaskBarList.SetOverlayIcon(Handle, FIcon.Handle, '');
end;
end.
看到我的程序图标右下角的小图标了吗.就是这个样子了.
在TaskBar上添加按钮
新版迅雷在Windows7上运行的时候会在缩略图上添加三个按钮.
可以实现任务的添加,下载,暂停等功能.
我们也可以仿照一个.
新建一个窗口
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShlObj, ActiveX, ComObj, ExtCtrls, StdCtrls, ImgList;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FTaskBarList: ITaskbarList4;
btnIcon : TIcon;
Fbtns: array [0 .. 2] of TThumbButton;
protected
procedure WndProc(var Message: TMessage); override;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
ZeroMemory(@Fbtns, SizeOf(TThumbButton) * length(Fbtns));
for I := Low(Fbtns) to High(Fbtns) do
begin
Fbtns[I].dwMask := THB_ICON or THB_TOOLTIP or THB_FLAGS;
Fbtns[i].hIcon := btnIcon.Handle;
Fbtns[I].dwFlags := THBF_ENABLED;
Fbtns[I].iId := I;
Fbtns[I].szTip := 'ABCD';
end;
// 这里什么图也没给,出现的按钮都是没有图标的
FTaskBarList.ThumbBarAddButtons(Handle, length(Fbtns), @Fbtns);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FTaskBarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList4;
FTaskBarList.HrInit();
btnIcon := TIcon.Create;
btnIcon.LoadFromFile('c:\AquaValue2.ico');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
btnIcon.Free;
end;
procedure TForm1.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_COMMAND:
begin
case HiWord(Message.WParam) of
THBN_CLICKED:
begin
ShowMessage(Format('你按了按钮[id=%d]', [LoWord(Message.WParam)]));
end;
end;
end;
end;
end;
end.
运行起来.按一下按钮.效果如下图:
但是现在还有个问题困扰了我半天.就是MSDN上说点击了按钮会受到WM_COMMAND消息.我也在WndProc中做了处理.但是不论怎样都收不到.正要放弃的时候突然灵光一闪.会不会是在调试状态运行和实际运行有啥区别呢?
于是找到编译好的EXE文件双击执行.哈哈,一切OK.虽然不知道是什么问题引起的.但是肯定和VCL或者Delphi的IDE调试环境有关.我又用C#和VC分别验证了一下.他们在调试状态下就没有这个问题.这只是一个小麻烦问题不大.呵呵.
新的ITaskBarList接口还有其他的一些方法.不过最常用的都是前面的几个.都很简单.有了前面的基础这些试一下就知道怎么用了.
注意哦,你的程序除非是Only for Windows7的.否则要判断一下操作系统版本号.再决定是否调用新的TaskBar功能.
转载于:https://www.cnblogs.com/MaxWoods/archive/2010/09/28/1837760.html
Windows7新的Taskbar 在 Delphi 2010 中的编程应用相关推荐
- Delphi 2010 安装及调试
呵呵,毫不客气地说,Delphi 2010 这个版本可以算是 Delphi 的一个"里程碑",为什么这么说?因为这个版本实现了几个 Delphi 应该有却一直没有的功能 Delph ...
- excel共享工作簿_Excel 2010中的共享工作簿限制
excel共享工作簿 Last week, a client sent me a workbook that I created for them a couple of years ago. The ...
- Delphi XE7中新并行库
Delphi XE7中添加了新的并行库,和.NET的Task和Parellel相似度99%. 详细内容能够看以下的文章: http://www.delphifeeds.com/go/s/119574 ...
- 『飞秋』Windows7新功能体验(1):为Windows 7 Media Center安装网络电视(Internet TV)
『飞秋』Windows7新功能体验(1):为Windows 7 Media Center安装网络电视(Internet TV) 在Windows 7许多的新功能里,娱乐功能也做了很大的改进: Dire ...
- Office 2010 中受保护的视图
大家好,我叫 Vikas,在 Office 可信计算安全团队工作.今天我将向各位详细介绍我一直从事的称之为"受保护的视图"的功能.受保护的视图是 Office 2010 中新增的深 ...
- Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结 .
Delphi7升级到Delphi 2010.Delphi XE.Delphi XE2总结 这两天把一个使用Delphi2007成功升级到了Delphi2010.升级途中很艰辛,总结了 以下经验与大家分 ...
- .Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
转自: http://guanyue7613.blog.163.com/blog/static/885147420120404747235/ 这两天把一个使用Delphi2007成功升级到了Delph ...
- SharePoint 2010中的客户端AJAX应用——ASP.NET AJAX模板
WCF Data Services是SharePoint 2010中一个极具吸引力的新特性.然而,因为它的强大,直接对其进行编程仍然会有点痛苦.幸运的是,一个新的相关技术 -- ASP.Net AJA ...
- Office 2010 中的 UI 扩展性
在 Office 2007 中引入功能区用户界面的同时,我们还引入了 RibbonX(功能区扩展性)模型,这是一种以编程方式自定义 Office 用户界面的新方法.RibbonX 允许第三方开发人员和 ...
最新文章
- Android左右连接和USING
- Generative Adversarial Nets[BEGAN]
- Beta 讨论分析——持续更新ing
- 这些年Android面试的那些套路,社招面试心得
- from 下拉框多个值提交_Git提交规范
- 种树(codevs 1768)
- 对pushState、replaceState和onpopstate一点使用
- java 图形界面---字体的设置
- oracle10g rac导出ocr,Oracle RAC 迁移OCR(10g)
- [转]Git使用基础篇
- C++ WinHTTP实现文件下载
- 蒙特卡洛光线追踪技术
- android蓝牙健康 iee,Wi-Fi RTT(IEEE 802.11mc)
- 7-2 秋天的第一杯奶茶 (5 分)
- unity迷你太空射击游戏截图
- 99%的异地恋都会失败,你们凭什么成为那1%?
- CSS #38; JS
- python图片批量处理(水印、重命名)
- [Android开发常见问题-19] Android为什么比IOS和WP慢?
- 斐波那契的N种实现方式
热门文章
- java实现第四届蓝桥杯有理数类
- 使用xml的时候出现org.eclipse.emf.ecore.xmi.FeatureNotFoundException: Feature 'context-parm' not found.
- 给你的导航页加把锁—php简单登录后进入导航
- 【Web技术】1346- 前端虚拟列表的实现原理
- 京东Q2财报表现亮眼,无界零售为核心驱动力
- 财金类部分资格证书2023年考试时间安排及入口
- 【STM32】STM32内部flash编程和擦除
- macOs 无法授权向日葵屏幕录制权限的办法
- 交大网络计算机第二学期,交通大学网络学院第二学期计算机第二次作业WINDOWS(5页)-原创力文档...
- python转换成exe后一闪而过_解决python xx.py文件点击完之后一闪而过的问题