托盘图标实例

 

很多人认为Delphi是一个RAD工具,包括我本人在上学的时候对Delphi也有偏见,现在走出了“象牙塔”,涉及的面广了,遇到的问题多了,慢慢地也有了自己的一点心得体会。其实,Delphi是基于Object Pascal 语言的开发工具,也就是说Delphi本质上是一种语言工具,并且是真正的面向对象的。下面我举的例子就是用Delphi实现的一个托盘小程序。程序短小精悍,脉络分明,我将对关键部分进行详细讲解。就象候俊杰先生把MFC一层一层地剥开一样,今天我也来一次“庖丁解牛”。


   在Delphi中涉及到系统编程的方面毫无例外都要调用API函数,在ShellAPI.pas单元中有要用到的API函数的原型。


实战演练:


一.新建一个应用程序:File->New ApplicatonInterface部分定义一个消息常量:const WM_NID=WM_USER+1000; 系统规定从WM_USER开始为用户自定义消息。


二.定义一个全局变量: NotifyIcon:TNotifyIconDataNotifyIcon是非常重要的一个变量,整个程序基本上是围着这个变量在转。TNotifyIconData是一个记录类型,按住Ctrl键,在TNotifyIconData 双击即进入ShellAPI.pas单元。(注:在Delphi中,这是一个非常好的对源代码进行分析的方法,源代码说明一切,你要想知道程序背后的内幕,最好的方法就是分析源代码!)此时出现了以下赋值语句:


TNotifyIconData = TNotifyIconDataA,这个意思很明显,就是说TNotifyIconDataTNotifyIconDataA是同种数据类型,接着往下看有:


TNotifyIconDataA = _NOTIFYICONDATAA,意思与刚才的一样,再往下看: 


type


_NOTIFYICONDATAA = record


       cbSize: DWORD;


       Wnd: HWND;


       uID: UINT;


       uFlags: UINT;


       uCallbackMessage: UINT;


       hIcon: HICON;


szTip: array [0..63] of AnsiChar;


end;


这可真是“千呼万唤始出来,犹抱琵琶半遮面”。现在大家很清楚了,我们刚才定义的全局变量NotifyIcon其实是一个包含有7个成分的记录类型变量,就相当于C/C++中的结构体变量(C/C++的程序员应该是再熟悉不过了)。下面我们逐个来解释记录类型中的7个部分各有什么功能。


1>        cbSize就是你定义的NotifyIcon变量的大小,用SizeOf(TNotifyIconData)可以取得,如果你是一个熟练的C/C++程序员,你应该不会陌生。在C/C++中,每当要为一个结构体变量分配内存的时候都要:通过 SizeOf(Struct type) 来获知存放一个这样的结构体变量要多少内存。


2>        Wnd是一个句柄,你希望托盘程序产生的消息有哪个窗体来处理就让Wnd指向那个窗体。


例如:你准备在任务栏的托盘小图标上单击时窗体是窗体在“显示”和“隐藏”之间切换,则把Wnd指向主窗体。


3>  uID:如果你要创建多个托盘小程序,那么怎么区分它们呢?就是靠这个ID号来区分。


3>        uFlags是一个标志位,它表示当前所创建的托盘程序具有哪些性质:


NIF_ICON          表示当前所设置的图标(即hIcon的值)是有效的


NIF_MESSAGE  表示当前所设置的系统消息(即uCallBackMessage的值)是有效的


NIF_TIP          表示当前所设置的提示条(即szTip的值)是有效的。


4>        uCallBackMessage这是7个部分里面最重要的一个。这里指定一个回调消息,也就是说这里定义一个消息名,当你单击或者右击托盘图标的时候就会向你在Wnd所指向的窗体发送一个在uCallBackMessage中定义的消息名,然后你在程序中定义一个消息出来函数来处理这个消息。这样就把Windows关于消息的整套流程都处理好了。


6>   hIcon为托盘图标的句柄,根据这个句柄你就可以增加、修改、删除图标。


7>       szTip就是当你的鼠标放到任务栏托盘的小图标上的时候弹出来的提示信息。


在这里我花了大量的笔墨介绍TNotifyIconData的内幕,把这部分搞清楚了,后面的东西就顺理成章了。


三. 双击主窗体,进入FormCreate的代码区域:


TForm1.FormCreate(Sender:TObject);


    Begin


        //NotifyIcon为全局变量,在程序的开头已经定义了


        with NotifyIcon do


        begin


  cbSize:=SizeOf(TNotifyIconData);


  Wnd:=Handle;   //指向当前窗体Form1的句柄


uID:=1;


  uFlags:=NIM_ICON or NIM_MESSAGE or NIM_TIP;


  uCallBackMessage:=WM_NID;


  hIcon:=Application.Icon.Handle;


  szTip:=”张家恶少


end;.


//把设置好的变量NotifyIcon加入到系统中以便处理


Shell_NotifyIcon(NIM_ADD,@NotifyIcon);


   End;


四.接下来就是定义一个消息处理函数:系统给窗体发来了一个消息,就由下面这个函数来处理。每个消息处理函数都是处理某一类消息的,大家仔细地看看下面函数体的定义和一般的函数定义有什么不一样:消息处理函数要在后面加上消息的名称,这样当系统发来WM_NID消息时,就是自动触发WMNID消息处理函数。


procedure WMNID(var msg:TMessage);message WM_NID;


       begin


        case msg.LParam of


          WM_LBUTTONUp; Form1.Visible:=not Form1.Visible;


           WM_RBUTTONUP: ShowMessage(‘您点击的是右键’);


        End;


End;


好了,一个最简单的程序诞生了,大家自己设置好自己喜欢的图标.


Project->Options,选中Application页面,在Icon项中加载自己喜欢的图标,这样程序运行时,在任务栏里显示的就是你喜欢的图标了。当你单击图标时,窗体Form1会在可见与不可见之间切换,也就是说单击一下显示,再单击一下又隐藏。当你右击图标的时候会弹出一条消息:“你点击的是右键”。


五.最后要记住在关闭应用程序的时候要释放掉建立的托盘程序,否则会占用系统资源。


TForm1.FormDestroy(Sender:TObject);


Begin


  Shell_NotifyIcon(NIM_DELETE,@NotifyIcon);


End;

 


毕业快半年了,很多东西在学校总理解不了,认识不够深刻;出到社会,接触了不少道中朋友,受益非浅,每有心得体会,总想写成文字,一来总结自己学的东西,二来和大家共同交流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 要在.NET中实现托盘图标,您需要使用System.Windows.Forms命名空间中的NotifyIcon类。 首先,您需要在窗体上添加NotifyIcon控件。接下来,可以使用以下代码来设置托盘图标图标和提示信息: ``` NotifyIcon trayIcon = new NotifyIcon(); trayIcon.Icon = new Icon("MyIcon.ico"); trayIcon.Text = "My Tray Icon"; ``` 然后,您可以使用以下代码将托盘图标显示在系统托盘中: ``` trayIcon.Visible = true; ``` 您还可以使用以下代码为托盘图标添加右键菜单: ``` ContextMenu contextMenu = new ContextMenu(); MenuItem menuItem = new MenuItem("My Menu Item"); menuItem.Click += new EventHandler(MyMenuItem_Click); contextMenu.MenuItems.Add(menuItem); trayIcon.ContextMenu = contextMenu; ``` 在上面的代码中,MyMenuItem_Click是当用户单击右键菜单中的菜单项时调用的方法。 最后,在窗体的FormClosing事件处理程序中,您可以使用以下代码来隐藏托盘图标: ``` trayIcon.Visible = false; ``` 希望这能帮到您! ### 回答2: 在使用.NET实现托盘图标时,我们可以使用System.Windows.Forms命名空间中的NotifyIcon类来实现。 首先,我们需要在程序的主窗体中添加一个NotifyIcon控件。可以通过在设计视图中拖拽NotifyIcon控件来实现,或者在代码中创建一个实例。例如,在Form的构造函数中添加以下代码来创建一个NotifyIcon实例并设置相关属性: ```csharp NotifyIcon notifyIcon = new NotifyIcon(); notifyIcon.Icon = new Icon("icon.ico"); //设置托盘图标 notifyIcon.Text = "托盘图标"; //设置鼠标悬停时显示的文本 notifyIcon.Visible = true; //设置托盘图标可见 ``` 接下来,我们可以为NotifyIcon控件添加一些功能,如鼠标点击、双击、右键菜单等事件。例如,我们可以为鼠标点击事件添加以下代码: ```csharp notifyIcon.Click += NotifyIcon_Click; ``` 然后,在NotifyIcon_Click事件中,我们可以编写相应的处理逻辑,例如,显示主窗体、最小化到托盘等操作。 最后,在程序退出时,需要将NotifyIcon控件释放掉,可以在主窗体的Closing事件中添加以下代码: ```csharp notifyIcon.Dispose(); ``` 通过以上步骤,我们就可以在.NET中实现一个简单的托盘图标了。当程序运行时,托盘图标会显示在任务栏的系统托盘区域中。用户可以通过鼠标点击、右键点击等操作来与托盘图标进行交互,实现一些常用功能,提升用户体验。 ### 回答3: 在使用.NET实现托盘图标之前,我们需要先创建一个Windows Forms应用程序。然后,我们可以按照以下步骤来实现托盘图标的功能。 1. 首先,我们需要引用System.Windows.Forms命名空间,该命名空间包含了托盘图标相关的类和方法。 2. 然后,我们需要在窗体的构造函数或Load事件中创建一个托盘图标对象。可以使用NotifyIcon类来创建托盘图标对象,并设置图标的相关属性,如图标文件、提示信息等。 3. 接下来,我们需要为托盘图标添加菜单项。使用ContextMenuStrip类来创建一个右键菜单,并将其赋值给托盘图标对象的ContextMenuStrip属性。然后,可以使用ToolStripMenuItem类来创建需要的菜单项,设置其名称和点击事件,最后将菜单项添加到右键菜单中。 4. 现在,我们需要实现点击菜单项的事件响应。可以在菜单项的点击事件中编写相应的处理代码,比如显示/隐藏窗体、退出应用程序等功能。 5. 最后,在窗体的Closing事件中添加一段代码,以确保在关闭应用程序时托盘图标也能正确地被释放。可以使用Dispose方法来释放托盘图标对象。 通过以上步骤,我们就可以实现使用.NET来创建和管理托盘图标了。可以自定义托盘图标的外观和行为,提供给用户一些自定义的功能选项。同时,使用托盘图标可以使应用程序以最小化到托盘的方式运行,提高用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值