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

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

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

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

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

  下面给出步骤23的实现代码:

  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;//指定在该结构中uCallbackMessagehIconszTip参数都有效

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

 

posted @ 2006-01-02 18:35  jimeper  阅读(2146)  评论(0编辑  收藏  举报