转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
Windows通知栏图标高级编程概述         ★★★★

Windows通知栏图标高级编程概述

作者:闵涛 文章来源:闵涛的学习笔记 点击数:4062 更新时间:2009/4/23 18:34:16
1.        重载主窗口的消息处理过程,拦截任务栏重建消息,进行重新添加图标的操作。

 

procedure TMainForm.WndProc(var Message: TMessage);

begin

  ……

  if Message.Msg = MsgTaskbarRestart then

  begin

    TrayIcon.Active := False;                  //删除通知栏图标

    TrayIcon.Active := True;                      //添加通知栏图标

  end;

  ……

  inherited WndProc(Message);

end; //end of WndProc

 

值得一提的是,如果将自动恢复的功能封装为控件,将以后的开发带来方便。但由于外壳只向所有顶层的应用程序发送通知,封装起来有一定的困难。因为通知栏图标的回调函数只能接收WM_XBUTTONDOWNWM_XBUTTONUP等有限的几个消息,并不能接收所有的窗口消息。

解决的方法是使用SetWindowLong函数。通过向它传入GWL_WNDPROC参数,可以改变一个窗口的窗口过程。只需在创建控件时将应用程序窗口的窗口过程指针保存起来,并指向为控件中的某个新的窗口处理过程,在控件中就能够响应所有的窗口消息了(包括任务栏重建的消息);当控件销毁的时候再将保存的原始窗口过程指针恢复即可,此处不再赘述。

 

 

3 与通知栏图标关联的快捷菜单弹出的时机

本节将讨论编写通知栏应用程序时应该注意的一个问题,即快捷菜单弹出的时机问题。Windows为通知栏图标提供了几个鼠标消息(事件),那么我们应该将弹出快捷菜单的代码写在哪个事件中呢?先别急于回答“放在MouseDown事件中”,事实上,这个看似简单的问题,其中却小有讲究。许多软件(有的甚至号称专业级软件)也都或多或少忽视了这个问题。

首先需要明确一个软件设计中通用的原则,即:应当给用户一个机会以确认是否执行他选择的操作。这在软件设计中有很多例子。大的方面,最普遍的,如用户选择了删除文件,应弹出窗口予以确认。小的方面,如Windows中对鼠标的常规处理,也有一个确认的动作。一般来说,Windows中的程序对于鼠标事件的响应都是这样:在用户松开鼠标后才认为他确认了点击操作。以按钮(Button)为例,对于Windows的标准按钮,用户都可以在按下鼠标后而未松开鼠标前把鼠标移动到按钮区域以外来取消这次单击操作。再如Windows中窗口系统菜单的弹出,当用户在窗口标题栏上按下鼠标右键后,可以把鼠标移动到标题栏以外再松开,这样系统菜单就不会弹出,即等价于用户取消了该次操作。

遵照这个原则,通知栏快捷菜单的弹出显然应该在用户松开鼠标按键后,即WM_XBUTTONUP消息到来时才发生,以保证用户能够在松开鼠标之前取消其弹出,而不应简单的把弹出菜单的代码放在WM_XBUTTONDOWN的消息响应中。纵观Windows操作系统附带的程序,皆是如此。

 

 

4 鼠标双击事件发生时单击事件的避免

编写过通知栏应用程序的朋友大概都碰到过这样的情况:如果编写了响应鼠标单击(WM_XBUTTONUP)与双击(WM_XBUTTONDBLCLK)的代码,那么在用户双击鼠标时单击事件也会发生。而在实际应用中通常希望单击与双击是相互独立的两个操作,它们之间不应该互相影响。对于这一问题,有些软件采用“鸵鸟战术”,不响应单击事件(即对WM_XBUTTONUP消息不作响应),只响应双击事件,这未尝不是一种解决办法,但浪费了单击事件,算不得好。通过下面的分析,我们将会看到一个较为令人满意的解决方法。

 

4.1 原理分析

Windows中并没有定义表示鼠标单击的消息,单击事件在Delphi等可视化编程语言中定义为鼠标按下后松开,因而单击事件一般在WM_XBUTTONUP中触发。而双击事件则不同,它在Windows中有明确的定义,当用户双击任意一个鼠标按键时,实际上按如下顺序Windows送出了四次消息:WM_XBUTTONDOWNWM_XBUTTONUPWM_XBUTTONDBLCLKWM_XBUTTONUP。显然,如果响应WM_XBUTTONUP消息而触发了单击事件,那么双击时必然会先触发一次单击。

我们的目的是对双击事件单独处理,为此只需引入一个延时机制即可。让计时器在发生WM_XBUTTONDOWN时开始计时,待超时后检查WM_XBUTTONDBLCLK是否已经发生,若已发生则触发双击事件,否则触发单击事件。关键的是延时多久才合适呢?长了没有意义,短了可能超时后WM_XBUTTONDBLCLK都没有发生。显然应该至少延迟双击时两次单击之间的时间间隔,这一时间可以有系统API函数GetDoubleClickTime得到。

 

4.2 解决方案

按照如下几个步骤对通知栏图标控件的代码稍加修改即可(注意WM_XBUTTONUP等消息中的“X”可为“L”、“M”、“B”,表示鼠标左键、中键、右键)。

A.   定义两个变量FMouseDblClickedFMouseUp,分别用以指示双击和鼠标松开是否已经发生,均初始化为False

B.   再为TEoCTrayIcon控件添加一个TTimer类成员变量FTimer,并在OnCreate事件中对它进行初始化:

 

constructor TEoCSysTray.Create(AOwner: TComponent);

begin

……

  FMouseDblClicked := False;

  FMouseUp := False;

  FTimer := TTimer.Create(Self);

  with FTimer do

  begin

    Enabled := False;

    Interval := GetDoubleClickTime;     //时钟间隔设为双击的时间间隔。

    OnTimer := OnButtonTimer;      &n

上一页  [1] [2] [3] [4] [5]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台