Delphi 最小化窗体到托盘

---- 现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标。象FoxMail 3.0 NetVampire 3.0等都提供了这样的功能。实现这样的功能实际上并不复杂,在窗口最小化时,窗口会发出WM_SYSCOMMAND消息,你只要需要截取Windows的WM_SYSCOMMAND消息,在窗口最小化时隐藏窗口并调用WindowsAPI函数Shell_NotifyIcon将定义的图标添加到任务栏上,Shell_NotifyIcon的函数定义是这样的:function Shell_NotifyIcon(dwMessage:DWORD; lpData: PNotifyIconData): BOOL; stdcall; 其中的参数dwMessage指定Shell_NotifyIcon函数的操作,可以是NIM_ADD NIM_DELETE NIM_MODIFY三个值中的一个,分别对应添加图标、删除图标、修改图标的动作。

---- 参数lpData指向的PNotifyIconData结构的定义如下:

_NOTIFYICONDATAW = record

     cbSize: DWORD;

     Wnd: HWND;

     uID: UINT;

     uFlags: UINT;

     uCallbackMessage: UINT;

     hIcon: HICON;

     szTip: array [0..63] of WideChar;

   end;

   TNotifyIconData = _NOTIFYICONDATAW;

---- 在这个结构中Wnd指明所属的窗口,UCallbackMessage指明回调消息,如果指明了Wnd和 uCallbackMessage,则当用户对任务栏图标有动作(如点击图标,在图标上移动光标等)。系统都会发送uCallbackMessage消息给Wnd指定的窗口。hIcon是要添加的图标的句柄,szTip 是图标的提示行(就是当移动光标到图标上,出现的一个小黄方框内出现的文字)。消息。实现上面的功能,最主要的是要处理WM_SYSCOMMAND消息和自定义的图标消息,这些消息在Delphi中并没有相应的事件。这里就需要使用到Delphi的自定义消息处理功能来截取并处理这些消息。

---- 首先看下面的程序。在执行程序之前,首先要改变Form1的Icon属性,给Form1装入一个图标,否则在任务栏上会出现一块空白。

unit Unit1;

interface

uses

   Windows, Messages, SysUtils,

Classes, Graphics, Controls, Forms,

   Dialogs,ShellAPI;

const

   WM_BARICON=WM_USER+200;

type

   TForm1 = class(TForm)

   private

      procedure WMSysCommand(var

Message: TMessage); message WM_SYSCOMMAND;

      procedure WMBarIcon(var

Message:TMessage);message WM_BARICON;

     { Private declarations }

   public

     { Public declarations }

   end;

var

   Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMSysCommand

(var Message:TMessage);

var

    lpData:PNotifyIconData;

begin

   if Message.WParam = SC_ICON then

   begin

      //如果用户最小化窗口则将窗口

      隐藏并在任务栏上添加图标

      lpData := new(PNotifyIconDataA);

      lpData.cbSize := 88;

//SizeOf(PNotifyIconDataA);

      lpData.Wnd := Form1.Handle;

      lpData.hIcon := Form1.Icon.Handle;

      lpData.uCallbackMessage := WM_BARICON;

      lpData.uID :=0;

      lpData.szTip := 'Samples';

      lpData.uFlags := NIF_ICON

or NIF_MESSAGE or NIF_TIP;

      Shell_NotifyIcon(NIM_ADD,lpData);

      dispose(lpData);

      Form1.Visible := False;

   end

   else

   begin

      //如果是其它的SystemCommand

      消息则调用系统缺省处理函数处理之。

      DefWindowProc(Form1.Handle,Message.

Msg,Message.WParam,Message.LParam);

   end;

//

end;

procedure TForm1.WMBarIcon(var Message:TMessage);

var

    lpData:PNotifyIconData;

begin

   if (Message.LParam = WM_LBUTTONDOWN) then

    begin

      //如果用户点击任务栏图标则将图标删除并回复窗口。

      lpData := new(PNotifyIconDataA);

      lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);

      lpData.Wnd := Form1.Handle;

      lpData.hIcon := Form1.Icon.Handle;

      lpData.uCallbackMessage := WM_BARICON;

      lpData.uID :=0;

      lpData.szTip := 'Samples';

      lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;

      Shell_NotifyIcon(NIM_DELETE,lpData);

      dispose(lpData);

      Form1.Visible := True;

    end;

end;

end.

---- 运行上面的程序,点击程序窗口标题栏上的最小化按钮,你就可以看到窗口被“最小化”成了一个任务栏图标,点击图标,窗口又会恢复原来的状态。

---- 从上面的程序可以看到,Delphi的自定义消息处理功能的实现也是十分简单的,首先在Form类的Private定义中加入自定义消息处理函数的定义,定义的描述如下:

procedure UserPro(Var Message:

TMessage):message WindowsMessage

其中UserPro是用户自定义消息处理函数的名称,

WindowsMessage是Windows消息常量或自定义消息常量。

---- 然后在程序中加入消息处理函数,函数的一般格式如下:

     Procedure UserClass.UserPro(Var Message:TMessage);

     var

//加入定义

     Begin

//加入程序语句

     End;

     其中UserClass是封装自定义消息处理函数的类的名称。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值