zoukankan      html  css  js  c++  java
  • 利用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文件管理功能的综合应用。

     

  • 相关阅读:
    如何解决WEB应用中文乱码问题
    js获取指定格式的时间字符串
    js 实现 Base64 编码的相互转换
    Sql Server 与 MySql 在使用 update inner join 时的区别
    VMware12创建新的虚拟机及设置硬件环境
    Sql Server 中使用日期遍历
    Linux 添加定时任务,crontab -e 命令与直接编辑 /etc/crontab 文件
    mysql 中 max_allowed_packet 查询和修改
    eclipse编译项目:Java @Override 注解报错的解决方法
    eclipse启动项目报错:java.lang.ClassNotFoundException: ContextLoaderListener
  • 原文地址:https://www.cnblogs.com/jimeper/p/309882.html
Copyright © 2011-2022 走看看