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

     

  • 相关阅读:
    浅析深度优先和广度优先遍历实现过程、区别及使用场景
    浅析为什么要用setTimeout模拟setInterval
    app弹出软键盘获取键盘高度不准确的原因及导致底部定位的元素无法贴近键盘的问题
    App平台iOS设备上因内存不足导致白屏、闪退的原因及其解决方案
    浅谈移动端开发技术
    浅析Console命令调试常用方法
    js正则表达式中的正向肯定预查和正向否定预查, 反向肯定和反向否定(这个翻译不准确)
    javascript的版本查看及js的历史
    【转】JS-正则表达式的反向引用
    【转】Linux虚拟网络设备之tun/tap
  • 原文地址:https://www.cnblogs.com/jimeper/p/309882.html
Copyright © 2020-2023  润新知