当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 腾讯QQ是当前流行的网络聊天工具之一,由于它在应用设计上有很多独特之处,所以也吸引了很多程序员对之进行研究和模仿。
 

 

    摘要:microsoft office infopath 2003 使用了多种 xml 技术,包括 xslt 、xml 架构 、xhtml 、xpath 、dom 、xml 签名和使用所有上述技术的 xml 处理器。这些技术由万维网联合会 (w3c) (www 联合会 (w3c):商业与教育方面的一个联合机构,该机构对与万维网相关的所有领域的研究工作进行监督,并促进标准的推出。)管理,并提供一套特定的规......
 ·重新编译 vcl70.bpl     »显示摘要«
    摘要:这是阿亮第一次写文章,有不正确的地方,欢迎讨论指正。 首先要更正一个错误的结论:只要程序用到borland的包,就必须要带上vclxx.bpl。 非也! 想必用dll来实现功能模块分割的伙计们都有痛苦经历:无法导出类;无法共享主进程的全局变量;调用dll时可能要传递一大堆参数;令人心烦的pchar;等等等等...borland通过包borland package library来解决了这些痛苦,在......


QQ窗体自动隐藏效果探究
腾讯qq是当前流行的网络聊天工具之一,由于它在应用设计上有很多独特之处,所以也吸引了很多程序员对之进行研究与模仿.在这里,我将利用delphi对qq的窗体自动隐藏效果提出自己的实现方法.

一.问题的提出

【程序编程相关:游戏外挂设计技术探讨①

【推荐阅读:翻譯Borland? Delphi? 2

熟悉qq使用的朋友都知道,当qq窗体区域超出屏幕四边时,窗体就会自动“消失”,只留下窗体一边的小部分显露在桌面上.当用鼠标移动到显露部分之上,窗体就会在隐藏位置重新完整显示;但当鼠标离开窗体区域后,窗体便会重新进入隐藏状态.

【扩展信息:FastReport常见问题集

对隐藏的全过程进行分析,可以得出两点推测:第一,窗体隐藏的处理是与窗体移动过程有关;第二,窗体隐藏的触发条件是窗体的区域已经移动到屏幕的可视范围之外.

对第一点推测,可以通过对窗体移动时产生的windows消息进行拦截处理加以实现.对第二点推测,如何去表示“窗体区域已经超出屏幕可视范围”这一条件成为实现的关键.

二.基本的分析

让我们先留意一下windows环境下窗体移动的过程与效果.当使用鼠标移动窗体的时候,窗体本身并没有立刻随鼠标的移动而发生位置的改变;相反,鼠标正在拖动的是一个大小与窗体一致的透明区域(确切的说一个虚线边框的矩形).当鼠标释放矩形后,窗体本身才会在矩形最后停留的地方出现,从而完成整个移动的过程.(注意:在windows 2000及xp环境下,如果在显示属性中选中“拖动时显示窗体内容”的显示效果选项,则上述过程无法观察.)

对qq窗体,其移动过程与上述无异,但却有一处不同.当我们把矩形移动到屏幕四边且已有部分超出时,矩形就会自动地停留在超出位置上并完整显示.此时不论我们怎样试图把矩形再向超出方向上移动,矩形也只保持在该位置.当释放鼠标之后,窗体的隐藏效果也就出现了.

从上述过程可以推断,触发隐藏条件后,即使仍处于移动过程但矩形本身却已经被锁定,因此对窗体位置的判断是发生在移动过程中,也就是说我们要拦截处理的windows消息是wm_moving.其次,在移动过程中首先发生位置变化的是矩形而不是窗体本身,因此实现隐藏的关键是对矩形参数的判断与设置.

我们可以先留意一下wm_moving消息的语法结构:

    wm_moving

wparam wparam

lparam lparam,

其中,wparam不被使用,而lparam则是一个指针,所指向的是一个rect结构.rect结构中包含了left.top.right.bottom四个参数,分别用于描述矩形的左上角与右下角,“该rect记录了窗体相对于屏幕的当前位置;当要改变拖动矩形的位置时,程序本身必须改变rect结构中各成员变量的相关值”.由此可知,我们要处理的矩形其实已经在wm_moving消息中被提到,我们要处理的也就是lparam所指向的rect结构的有关参数.

接下来我们要设置一个由隐藏条件激活的计时器,目的是监控鼠标相对窗体的位置.因为窗体隐藏后的隐现是靠鼠标激活的,所以若检测到鼠标位于窗体之上,则说明窗体在显示状态;反之,窗体在隐藏状态.我们只需在相关的判断下加入对窗体top与left属性的赋值即可实现隐现效果.

至此,有关自动隐藏效果的实现分析就基本完成了.不过还要注意一点,因为我们是在wm_moving消息的拦截处理中判断隐藏条件,而通过计时器的ontimer事件处理隐现效果.在此隐藏条件是否满足在两个过程中的传递将成为关键.同时我们要知道的不仅是隐藏条件是否满足,还必须知道窗体是在屏幕的那一边上发生隐藏.为此,我们需要定义一个集合去描述窗体隐藏的位置,例如:

type

  hideposkind = (hptop,hpleft,hpbottom,hpright);

type

  thidepos = set of hideposkind;

不过,类似的集合在delphi本身就已经存在,譬如tanchors集合.tanchors集合原来是用于指明一个控件如何锚定于其父类控件的位置,我们在这里则借用来描述窗体对屏幕的隐藏位置.


...   下一页
    摘要: delphi下的接口编程  delphi下的接口编程学习笔记1.1 为什么使用接口? 举个例子好了:有这样一个卖票服务,电影院可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电影院、、歌剧院和客运站都设计成一个类架构以提供卖票服务?要知道,连经理人都可以卖票,很显然不适合把经理人也包括到卖票服务的继承架构中,我们需要的只是一个共通的卖票服务。于是,卖票的服务是个接口,电影院、歌剧院......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE