Programming 版 (精华区)

发信人: samuel (孔雀翎), 信区: Programming
标  题: Delphi自定义消息应用一例
发信站: 哈工大紫丁香 (2002年02月18日14:24:22 星期一), 站内信件

欢迎访问编程爱好者网站 http://www.programfan.com
Delphi自定义消息应用一例
---- 现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平
常那样最小化到任务栏上,而是“最小化”成一个任务栏图标。象FoxMail 3.0 NetVam
pire 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是封装自定义消息处理函数的类的名称。
---- 最后,Delphi的自定义消息处理函数要涉及到Windows的消息的结构,在这里我就
不多说了,大家可以参考Windows API帮助和Delphi的相关帮助信息。相信大家如果掌握
了Delphi的自定义消息处理函数,一定可以编写出象VB一样简洁,象C++一样功能强大的
程序来的。

--
月圆之夜 紫禁之巅 一剑西来 天外飞仙

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 天外飞仙]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.892毫秒