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 断点( ...
随机推荐
- BZOJ 3622: 已经没有什么好害怕的了(二项式反演)
传送门 解题思路 首先将\(a\),\(b\)排序,然后可以算出\(t(i)\),表示\(a(i)\)比多少个\(b(i)\)大,根据容斥套路,设\(f(k)\)表示恰好有\(k\)个\(a(i)\) ...
- 2019 牛客暑期多校 B generator 1 (矩阵快速幂+倍增)
题目:https://ac.nowcoder.com/acm/contest/885/B 题意:给你x0,x1,让你求出xn,递推式时xn=a*xn-1+b*xn-2 思路:这个n特别大,我自己没有摸 ...
- 探索Redis设计与实现13:Redis集群机制及一个Redis架构演进实例
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- leetcode上的一些动态规划
70-爬楼梯 思路:该问题可以理解为经典的“斐波那契数列”问题,但这里需要用动规实现,递归会超时 class Solution { public: int climbStairs(int n) { v ...
- 69、schema的相关方法
public class SObjectSchema { public void testSchema(){ //获取SObject的token //1.先获取所有token,然后通过key获取需要的 ...
- js 中 !!的用法
!!是将表达式强制转化为bool值的运算,运算结果为true或false,表达式是什么值,结果就是对应的bool值,不再取非. 不是取非再取非的意思!!! !!false=false; 要注意f ...
- upc组队赛7 Slimming Plan
Slimming Plan 题目描述 Chokudai loves eating so much. However, his doctor Akensho told him that he was o ...
- C/C++程序员 面试经历总结
最近在找工作,遇到了一些面试题,很惭愧的是很多都没答上来. 现在把一些问题总结一下,算是记录一下面试的经历吧.以后有空简单地回答一下, 同时也欢迎各位同仁解答,共同学习一下吧! 一.嵌入式C语言面 ...
- 转 Jmeter业务请求比例
[转载]Jmeter业务请求比例1 ps:文章转自订阅号“测试那点事儿”,链接:https://mp.weixin.qq.com/s/qVD4iNO0QqRIwAIq9_E_Kw 方法二: 可 ...
- 使用IntelliJ IDEA配置Maven(详细操作)
一,下载Maven 进入官网http://maven.apache.org/ 点击Download 找到如下图所示的区域,注意你的操作系统. 点击安装你所需要的安装包,下载,解压. 二,Maven环 ...