利用Delphi实现系统状态栏图标

利用Delphi实现系统状态栏图标 
   下面以一个具体的例子,详细介绍一下利用Delphi实现系统状态栏图标的步骤和方法。

  1.创建一个应用程序,在主窗体上增加一个TpopupMenu组件。并为该弹出选单组件增加选单项Exit,标题为“退出”。

  2.在Uses中添加ShellAPI,因为在系统状态栏中增加图标时需调用ShellAPI中的函数
Shell_NotifyIconA。该函数需要两个参数,其中一个是TnotifyIconDataA结构,需在主窗体中增加TnotifyIconDataA类型的全局变量ntida。

  3.定义消息mousemsg,并编写主窗体的mousemessage消息处理函数,此函数说明在图标上用鼠标左键单击时,会打开应用程序窗口;用鼠标右键单击时,会弹出一个选单。

  下面给出步骤2和3的实现代码:

  unit Unit1;

  interface

  uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, ExtCtrls, Menus, shellapi;

  const

  mousemsg = wm_user + 1; //自定义消息,用于处理用户在图标上点击鼠标的事件

  iid = 100; //用户自定义数值,在TnotifyIconDataA类型全局变量ntida中使用

  type

  TForm1 = class(TForm)

  ......

  private

  //自定义消息处理函数,处理鼠标点击图标事件

  procedure mousemessage(var message: tmessage); message mousemsg;

  public

  { Public declarations }

  end;

  var

  Form1: TForm1;

  ntida: TNotifyIcondataA;

  //用于增加和删除系统状态图标

  implementation

  {.DFM}

  procedure TForm1.mousemessage(var message: tmessage);

  var

  mousept: TPoint; //鼠标点击位置

  begin

  inherited;

  if message.LParam = wm_rbuttonup then begin //用鼠标右键点击图标

  getcursorpos(mousept); //获取光标位置

  popupmenu1.popup(mousept.x, mousept.y);

  //在光标位置弹出选单

  end;

  if message.LParam = wm_lbuttonup then begin //用鼠标左键点击图标

  //显示应用程序窗口

  ShowWindow(Handle, SW_SHOW);

  //在任务栏上显示应用程序窗口

  ShowWindow(Application.handle, SW_SHOW);

  SetWindowLong(Application.Handle, GWL_EXSTYLE,

  not (GetWindowLong(Application.handle, GWL_EXSTYLE)

  or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW));

  end;

  message.Result := 0;

  end

  4.编写FormCreate的代码如下:

  procedure TForm1.FormCreate(Sender: TObject);

  begin

  ntida.cbSize := sizeof(tnotifyicondataa); //指定ntida的长度

  ntida.Wnd := handle; //取应用程序主窗体的句柄

  ntida.uID := iid; //用户自定义的一个数值,在uCallbackMessage参数指定的消息中使

  ntida.uFlags := nif_icon + nif_tip + nif_message;//指定在该结构中uCallbackMessage、hIcon和szTip参数都有效

  ntida.uCallbackMessage := mousemsg;

  //指定的窗口消息

  ntida.hIcon := Application.Icon.handle;

  //指定系统状态栏显示应用程序的图标句柄

  ntida.szTip := 'Icon';

  //当鼠标停留在系统状态栏该图标上时,出现该提示信息

  shell_notifyicona(NIM_ADD, @ntida);

  //在系统状态栏增加一个新图标

  end;

  5.编写Tform1.OnClose的代码如下:

  procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

  begin

  Action := caNone; //不对窗体进行任何操作

  ShowWindow(Handle, SW_HIDE); //隐藏主窗体

  //隐藏应用程序窗口在任务栏上的显示

  ShowWindow(Application.Handle, SW_HIDE);

  SetWindowLong(Application.Handle, GWL_EXSTYLE,

  GetWindowLong(Application.handle, GWL_EXSTYLE)

  or WS_EX_TOOLWINDOW AND NOT WS_EX _APPWINDOW);

  end;

  6.编写Exit代码如下:

  当用户点击Exit时实现完全退出应用程序。具体代码如下:

  procedure TForm1.ExitClick(Sender: TObject);

  begin

  //为ntida赋值,指定各项参数

  ntida.cbSize := sizeof(tnotifyicondataa);

  ntida.wnd := handle;

  ntida.uID := iid;

  ntida.uFlags := nif_icon + nif_tip + nif_message;

  ntida.uCallbackMessage := mousemsg;

  ntida.hIcon := Application.Icon.handle;

  ntida.szTip := 'Icon';

  shell_notifyicona(NIM_DELETE, @ntida);

  //删除已有的应用程序图标

  Application.Terminate;

  //中断应用程序运行,退出应用程序

  end

  通过以上步骤,我们即可用Delphi轻松实现系统状态栏图标。

 

在Delphi中实现系统状态栏图标(托盘图标)

程序中增加使用该功能时,须在Uses中添加ShellAPI。添加图标时需要的函数是

:Shell_NotifyIconA,它需要2个参数,一个参数是TnotifyIconDataA的结构,该

结构如下:
    TnotifyIconDataA = record
        cbSize: DWORD;
        Wnd: HWND;
        uID: UINT;
        uFlags: UINT;
        uCallbackMessage: UINT;
        hIcon: HICON;
        szTip: ARRAY[0..63] of AnsiChar;
    end;

    dwMessage取值为:
    NIM_ADD        增加一个新图标
    NIM_MODIFY    修改一个已有的图标
    NIM_DELETE    删除一个已有的图标

实现一个Delphi中实现系统状态栏图标的窗体步骤如下:
1)创建一个应用程序
2)在主窗体上加一个TButton组件、一个TImage组件和一个TPopupMenu组件
3)编写主窗体的mymessaage消息处理函数,此函数说明在图标上用鼠标右键单击

时会弹出一个菜单
4)编写TButton组件的OnClick事件及菜单项的OnClick事件
5)程序源代码如下所示:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

Forms,
  Dialogs, Menus, ImgList, StdCtrls, ShellAPI, ExtCtrls;

const
  mymsg = wm_user + 1;
  iid = 100;

type
  TForm1 = class(TForm)
    Button1: TButton;
    PopupMenu1: TPopupMenu;
    a11: TMenuItem;
    b11: TMenuItem;
    c11: TMenuItem;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure c11Click(Sender: TObject);
    procedure a11Click(Sender: TObject);
  private
    { Private declarations }
    procedure mymessage(var message:tmessage);
    message mymsg;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ntid: TnotifyIconDataA;

implementation

{$R *.dfm}

//隐藏窗口,在托盘上显示图标
procedure TForm1.Button1Click(Sender: TObject);
begin
  ntid.cbsize := sizeof(TnotifyIconDataA);
  ntid.Wnd := Handle;
  ntid.uID := iid;
  ntid.uFlags := NIF_ICON + NIF_TIP + NIF_MESSAGE;
  ntid.uCallbackMessage := mymsg;
  ntid.hIcon := image1.Picture.Icon.Handle;
  ntid.szTip := 'asdf';
  shell_noti
fyicona(NIM_ADD,@ntid);

  self.Visible := false;
end;

//处理鼠标右键,弹出菜单
procedure TForm1.mymessage(var message:tmessage );
var
  mypt:Tpoint;
begin
  Inherited;
  if message.LParam = WM_RBUTTONUP then
  begin
    getCursorPos(mypt);
    PopupMenu1.Popup(mypt.X, mypt.Y);
  end;
  message.rResult := 0;
end;

procedure TForm1.c11Click(Sender: TObject);
begin
  close;
end;

//还原窗口,托盘图标消失
procedure TForm1.a11Click(Sender: TObject);
begin
  ntid.cbSize := sizeof(TnotifyIconDataA);
  ntid.Wnd := Handle;
  ntid.uID := iid;
  ntid.uFlags := NIF_ICON + NIF_TIP + NIF_MESSAGE;
  ntid.uCallbackMessage := mymsg;
  ntid.hIcon := image1.Picture.Icon.Handle;
  ntid.szTip := 'asdf';
  shell_notifyicona(NIM_DELETE,@ntid);
 
  self.Visible := true;
end;

end.

文件是同一类型元素的有序集合,是内存与外设间传输数据的渠道。一些外设如显示器、键盘、打印机等都可以看作文件,但最常用的还是磁盘文件,这也是本章我们主要讨论的对象。

         Delphi继承了Object Pascal的文件管理功能,并有很大的发展,其中最主要的是提供了用于文件管理的标准控件,同时也提供了更多的文件管理函数。利用Delphi的强大功能,开发一个自己的文件管理系统就成为很容易的事。

         本章首先介绍Delphi文件管理的基本概念和标准过程/函数,并提供了一个记录文件的应用实例,这是从我们实际课题开发中提取出来的。而后介绍Delphi提供的文件控件的使用方法。最后提供的一个综合例程MDI文件管理器则是对Delphi文件管理功能的综合应用。

 

时间: 2024-08-12 16:42:23

利用Delphi实现系统状态栏图标的相关文章

Android系统状态栏图标间距大小的调整

最直接有效的办法就是在做图标的时候留出间距,在代码或者布局中设置间距效果不是很明显.

在Delphi中使用动态图标

在应用程序的编写中,组合框(ComboBox).列表框(ListBox).等常见的部件,通常不仅要用于显示文字,而且还要显示其与文字相关的图标.在一般的Windows应用程序中,这些图标的显示都要随列出的显示文本的变化而变化,例如在组合框中列出当前目录下的所有文件时,在组合框左边就显示与文件名相关联的图标,这就是所谓的动态图标.在Delphi中使用动态图标的步骤如下: 一.图标的获取 要使用动态图标,首先要解决的是如何获得显示文本和与其相关联的图标句柄.该图标通过文件关联由系统注册表决定,并且在

利用delphi完全控制桌面的实现

在windows 中系统桌面和开始菜单可以说是它的一大特色,其实我们可以利用delphi轻易地在应用程序中实现这种技术 : 新建一个应用程序, 将form1窗体的borderstyle属性设置为bsnone,formstyle属性设置为 fsstayontop,windowstate属性设置为wsmaximized. 如有必要可在form1窗体中放置一个image控件image1,为它的picture属性装入一幅自己喜爱的图像并将它的align属性设置为alclient,stretch设置为tr

笔记本win7系统音量图标不见了的解决方法

  日常生活中,win7系统用户在使用笔记本电脑时,会利用电脑桌面上的音量图标,对系统音量的大小进行设置.不过有笔记本win7系统用户反映系统桌面上的音量图标不见了,音量图标的不见会给用户的正常使用操作电脑带来不便.那么遇到这种情况我们应该怎么办呢?下面就来看看如何解决音量图标不见的问题! 方法如下: 1.确保电脑声卡驱动程序的正确安装,没有正确安装的话就选择上网下载一个; 2.如果电脑声卡驱动程序有正确安装,那么鼠标点击"开始"菜单; 3.选择"控制面板"选项,在

Google Chrome浏览器去掉状态栏图标的简单方法

相信大家很多人都升级到了Chrome 35,Chrome35使用了自己的Aura而不是GTK+,而且也多了一些有点烦人的东西,比如部分窗口有黑边,会在状态栏显示Chrome图标,看起来与系统图标十分不协调啊,黑边可能是由于Aura造成的相信会在以后解决,不过状态栏图标,如果不想显示还是有办法去掉的,代价是禁止其后台运行.     去掉Google Chrome浏览器的状态栏图标的方法: 方法很简单就是要禁止其后台运行即可.大家可以点击状态栏的Chrome图标,在那里有一个让Google Chro

Win7系统桌面图标多出一个盾牌标志怎么办

  Win7系统桌面图标多出一个盾牌标志怎么办           具体方法如下: 1.首先右键"计算机"点"管理",选中"本地用户和组",再点"用户"; 2.然后双击列表里的Administrator,把"账户已禁用"前面的勾取消掉; 3.然后点开开始菜单里的"文档"上面的那个个人文件夹,把里面的所有文件保存一下;然后把桌面上一些比较重要的文件或者文件夹也保存到别的盘里; 4.然后在关

关闭Win7系统桌面图标阴影效果方法

win7系统中,通过各种优化后会发现win7桌面图标突然出现阴影现象,这对操作倒是没什么影响,但是对视觉上,心理上感觉都是那么的不和谐,要怎么才能去掉图标上的阴影呢?去掉阴影会是个难事吗?一起来看一下吧. 步骤一:首先在桌面"计算机"图标上右键点击,选择"属性". 步骤二:然后,在弹出的属性对话框中选择"高级系统设置". 步骤三:在系统属性窗口中,选择"高级"选项卡,其实在上一步已经选择了"高级"选项卡了,

win7系统桌面图标怎么摆放

  win7系统桌面图标怎么摆放 1.在桌面空白位置,点击鼠标右键--然后选择个性化; 2.在弹出的窗口中选择"更改桌面图标",点击进入桌面图标设置; 3.进入桌面图标设置窗口:将计算机.回收站.网络前面的方框,鼠标左键单击,方框出现一个对号,表示已经选定点击确定就可以了; 4.这时桌面上就不是只有一个回收站了,还有其他的图标了哦,还是在桌面的空白位置,点击鼠标右键--查看--将"自动排列图标"前面的对号点掉,这样你就可以随意移动桌面所有的图标了; 5.看看这是我随

Win7系统桌面图标有蓝色问号怎么解决?

  Win7系统桌面图标有蓝色问号怎么解决? 1.打开"计算机",点击"组织"选择"文件夹和搜索选项"; 2.在"文件夹选项"的"查看"选卡中"高级设置"下方框中点击"显示隐藏的文件.文件夹和驱动器",然后将"隐藏受保护的操作系统文件(推荐)"前面的勾去掉,点击应用并确定即可; 3.切换到桌面,我们可以看到一个名为".svn"的