利用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文件管理功能的综合应用。