delphi 给程序加托盘图标
一些程序运行时,会在桌面的右下角显示一个图标(任务栏的右边),这类图标称为 托盘。托盘是一个PNotifyIconDataA类型的结构,要增加托盘图标其实就是对结构PNotifyIconDataA的操作。使用控件CoolTrayIcon是个不错的选择,不过这里也给出简单实现,方便初学者学习。
这里给出实际的例子程序代码,只在form窗体上增加2个默认按钮
1、需要包含shellapi
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, shellapi, Menus;
const
WM_TaskbarIconCallBack=WM_USER+78; //托盘图标返回消息
type
TForm1 = class(TForm)
Button1: TButton;
PopupMenu1: TPopupMenu;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure TaskIcon_add(TitleName: String;ToolPopupMenu_Left,ToolPopupMenu_Right: TPopupMenu);
procedure Button2Click(Sender: TObject);
procedure nihao1Click(Sender: TObject);
procedure TrayMsg(var Msg: TMessage);message WM_TaskbarIconCallBack;
private
{ Private declarations }
PNotify : PNotifyIconDataA; //义托盘图标结构
public
{ Public declarations }
Protected
FPopupMenu_Left,FPopupMenu_Right: TPopupMenu; //义托盘图标结构
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{**********************************************
author/date:
description:给程序增加托盘
参数介绍:
TitleName:图表tip
ToolPopupMenu_Left,ToolPopupMenu_Right:点图标对应的弹出菜单
使用本函数需要包含单元
QMenus
**********************************************}
procedure TForm1.TaskIcon_add(TitleName: String;ToolPopupMenu_Left,ToolPopupMenu_Right: TPopupMenu);
begin
If Assigned(ToolPopupMenu_Left) Then
FPopupMenu_Left:=ToolPopupMenu_Left;
If Assigned(ToolPopupMenu_Right) Then
FPopupMenu_Right:=ToolPopupMenu_Right;
New(PNotify);
with PNotify^ do
begin
Wnd:=self.Handle;
uID:=0;
uFlags:=NIF_ICON+NIF_MESSAGE+NIF_TIP;//托盘的属性
hIcon:=Application.Icon.Handle; //把系统图表作为托盘
uCallbackMessage:=WM_TaskbarIconCallBack;
StrCopy(szTip, PChar(TitleName));
end;
Shell_NotifyIcon(NIM_ADD,PNotify);
end;
//增加系统图标做为托盘图标
procedure TForm1.Button1Click(Sender: TObject);
begin
TaskIcon_add('我是托盘',PopupMenu1,PopupMenu1);
end;
//释放托盘图标
procedure TForm1.Button2Click(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,PNotify);
end;
//托盘消息相应
procedure TForm1.TrayMsg(var Msg:TMessage);
Var
APoint : TPoint;
Begin
with Msg do
begin
if (Msg = WM_TaskbarIconCallBack) then
begin
GetCursorPos(APoint);
case LParam of
WM_LBUTTONDOWN :
begin
if Assigned(FPopupMenu_Left) Then
FPopupMenu_Left.Popup(APoint.X, APoint.Y);
end;
WM_RBUTTONDOWN :
begin
if Assigned(FPopupMenu_Right) Then
FPopupMenu_Right.Popup(APoint.X, APoint.Y);
end;
end;
end
end;
End;
// if Msg.LParam = WM_LBUTTONDBLCLK then Form1.Show;
procedure TForm1.nihao1Click(Sender: TObject);
begin
showmessage('我是托盘左右键菜单');
end;
end.
如果要实现动态托盘,可以加ontimer事件处理,用函数 Shell_NotifyIcon 动态修改托盘图标
procedure TForm1.Timer1Timer(Sender: TObject);
begin
iconindex:=iconindex+1;
if iconindex=Imagelist1.Count then iconindex:=0;
Imagelist1.GetIcon(iconindex,tempicon);
PNotify.hIcon:=tempicon.Handle;
Shell_NotifyIcon(NIM_MODIFY,@PNotify);
end;
delphi 给程序加托盘图标的更多相关文章
- 关于Windows平台下应用程序加载DLL模块的问题.
本文将讨论以下问题: (1)Windows可执行程序会从哪些目录下加载DLL. (2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE同一目录. (3)可执行程序加载了不该加载的DLL. ( ...
- 第一个Delphi小程序
第一次应工作需呀,接触这个语言,今晚在自己的电脑搭建好环境,写的第一个超简单的Delphi小程序! var temp:Integer; //求个位数 procedure TForm1.BitBtn1C ...
- 无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6”
"System.InvalidOperationException"类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 无法为具有固定名称"MySql. ...
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
- 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.m
Windows服务中程序发布之后会如下错误: 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“Syste ...
- 刚部署的程序加载不出来css,js以及图片
刚部署的程序加载不出来css,js以及图片,解决方式 需要在配置中加入静态资源 方法一: controller.xml中加入 <mvc:annotation-driven/> <mv ...
- Delphi:程序自己删除自己,适用于任何windows版本(含源码)
Delphi:程序自己删除自己,适用于任何windows版本(含源码) function Suicide: Boolean; var sei: TSHELLEXECUTEINFO; szMod ...
- Delphi应用程序的调试(五)其他调试工具
Delphi应用程序的调试(五)其他调试工具 Delphi7中提供了一些附加调试工具来帮助用户检查程序错误.从性能上讲,其中一些工具属于高级调试工具.尽管高级调试工具不像其他工具那样常用,但对于经验丰 ...
- Delphi应用程序的调试(二)使用断点
Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...
随机推荐
- Linux文件归档工具——cpio
一cpio的介绍 功能:复制文件从或到归档 cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件. cpio [选项] > 文件 ...
- Python基础(三):简化除法判断、分析apache访问日志、扫描存活主机、利用多线程实现ssh并发访问
一.简化除法判断 目标: 编写mydiv.py脚本,主要要求如下: 提示用户输入一个数字作为除数 如果用户按下Ctrl+C或Ctrl+D则退出程序 如果用户输入非数字字符,提示用户应该输入数字 如果用 ...
- BZOJ 3585: mex(分块+莫队)
传送门 解题思路 首先直接莫队是能被卡的,时间复杂度不对.就考虑按照值域先进行分块再进行莫队,然后统计答案的时候就暴力扫所有的块,直到一个块内元素不满,再暴力扫这个块就行了,时间复杂度O(msqrt( ...
- Hadoop 家族技能图谱skill-map
----# Hadoop 家族技能图谱- Hadoop- Zookeeper- Avro- Chukwa- Ambari- Whirr- Bigtop- HCatalog- Hue- HBase- P ...
- LInux终端中Ctrl+S卡死
因为初学Linux,在vim中写东西是总是喜欢按Ctrl+s来保存内容导致终端突然卡主,然后上网查资料发现了Ctrl+s 暂停屏幕输出[锁住终端]而对应的按键是Ctrl+q 恢复屏幕输出[解锁终端]
- sqlserver定时作业,定时执行存储过程
首先,我想说,我真的是渣了,一个这个玩意弄了半天,算了,直接切入正题吧. 第一步: 先写好存储过程 用了两张表,你们自己建立吧 <br data-filtered="filtered& ...
- Eclipse转idea改设置
1 自动导包:画圈的打钩,实现自动导包,去除无用包.导入的类名相同时需要自己手动导包-> alt+enter. 2:修改快捷键 左移光标,右移同理. 上移光标:下移同理 光标移至行首,行末为e ...
- elemeng-ui中el-select的默认选择项问题
直接绑定将option中的value值绑定给v-model <template> <div> <el-select v-model="query"&g ...
- MVC,MVP 和 MVVM 的图示(转载)
MVC,MVP 和 MVVM 的图示 作者: 阮一峰 日期: 2015年2月 1日 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常 ...
- GNU Linux 64汇编学习
函数调用传参: 第一个参数:rdi, 第二个参数:rsi 函数调用栈结构: 返回值 第一个参数 第二个参数 +----------+ rsp-24 | a | +----------+ rsp-16 ...