通行证: 用户 密码
http://www.pconline.cn/
汽车网 | 游戏网 | 时尚女性
分站:北京 上海 广州 深圳 香港
广西 重庆 山东 江苏 辽宁 福建
首 页 | 今日报价 | 新闻中心 | 数码世界 | 硬件资讯 | 软件资讯 | 下 载 | 游 戏 |
论 坛 | 产 品 库 | 渠道商情 | 招聘培训 | 二    手 | 评 测 室 | 导 购 | 社 区 |
摄影
部落
手 机
数码相机
随身听
 DIY配件
笔记本
 台式机
摄像机
精品廊
-
您现在的位置:软件资讯 > 开发特区 > 开发语言 > Delphi
  QQ窗体自动隐藏效果探究 出处:CSDN
[ 2005-04-18 14:14:04 ] 作者:cobi 责任编辑:huangpeidan
-

三、初步的实现

  首先我们定义一个过程对WM_MOVING消息进行拦截处理,代码如下:

……
private
FAnchors: TAnchors;
procedure WMMOVING(var Msg: TMessage); message WM_MOVING;
……
uses Math,type;
procedure TForm1.WMMOVING(var Msg: TMessage);
begin 
 inherited; 
 with PRect(Msg.LParam)^ do
 begin 
   Left := Min(Max(0, Left), Screen.Width - Width); 
   Top := Min(Max(0, Top), Screen.Height - Height); 
   Right := Min(Max(Width, Right), Screen.Width); 
   Bottom := Min(Max(Height, Bottom), Screen.Height); 
   FAnchors := []; 
   if Left = 0 then Include(FAnchors, akLeft); 
   if Right = Screen.Width then Include(FAnchors, akRight); 
   if Top = 0 then Include(FAnchors, akTop); 
   if Bottom = Screen.Height then Include(FAnchors, akBottom); 
   Timer1.Enabled := FAnchors <> []; 
  end;
end;

  在该过程中,我们通过对矩形参数Left、Top、Right、Bottom的判断确定窗体所处位置是否符合隐藏条件,判断结果存放在全局变量Fanchors之中。当触发隐藏时,在Fanchors中将至少有一个值而不多于两个值。(为什么呢?)

  判断条件的设置似乎和我们一般的理解有点不同。以Left参数的判断为例,在判断了Max(0, Left)之后还为什么一定要与Screen.Width – Width的值再作比较呢?这其实是为了对一些较为极端的情况(例如窗体的宽度大于屏幕宽度)所作的伪处理,大家如果有兴趣的可自己试验一下这些极端的效果。当然,如果我们的窗体限制了宽、高的最大值,那么判断也就可以简化为我们最初的理解。

  最后需要注意的是,代码中出现的Left、Top、Right、Bottom都是RECT的参数,而Width和Height才是窗体Form1的属性。

  接下来我们要处理TTimer的OnTimer事件了。在WMMOVING过程中,当Fanchors不为空时,TTimer启动;反之,TTimer关闭。OnTimer事件的代码如下:

procedure TForm1.Timer1Timer(Sender: TObject);
const 
  cOffset = 2;
begin 
 if WindowFromPoint(Mouse.CursorPos) = Handle then
 begin 
   if akLeft in FAnchors then Left := 0; 
   if akTop in FAnchors then Top := 0; 
   if akRight in FAnchors then Left := Screen.Width - Width; 
   if akBottom in FAnchors then Top := Screen.Height - Height; 
 end else 
 begin 
   if akLeft in FAnchors then Left := -Width + cOffset; 
   if akTop in FAnchors then Top := -Height + cOffset; 
   if akRight in FAnchors then Left := Screen.Width - cOffset; 
   if akBottom in FAnchors then Top := Screen.Height - cOffset; 
  end;
end;

  在这里,我们首先定义一个常量cOffset去表示窗体隐藏后显露部分的大小。然后我们利用WindowFromPoint这个Windows API函数检测鼠标是否位于窗体之上。接下来的判断就是处理在显示和隐藏状态下窗体Left和Top属性值的设置。注意,针对Fanchors中存在不同值的情况,窗体Left和Top的设置是各不相同的,但是这些设置只有顺序上的差异而并没有优先级别的差异。(为什么要提到这一点呢?)

  最后需要注意的是:在本事件中Top、Left、Width和Height都是窗体Form1的属性值。

  好了,有关窗体隐藏的核心代码已经介绍完毕了,不过要达到预期效果,窗体Form1在创建时还必须做一些准备工作,代码如下:

procedure TForm1.FormCreate(Sender: TObject);
begin 
  Timer1.Enabled := False; 
  Timer1.Interval := 200; 
  FormStyle := fsStayOnTop;
end;

  这里的代码相对简单,不过值得指出的是对Form1的FormStyle属性的设置。FormStyle为fsStayOnTop时可保证了Form1始终位于最前显示。从效果角度看,当系统工具栏为“总在最前显示”时是最为明显的,因为若窗体移动到系统工具栏上时也不会被其所遮盖。

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

正在加载评论,请稍候…


ad
发给好友 我要报错 投稿给我们 加入收藏 返回顶部

本栏今日更新
相关文章
·新闻一周谈:Firefox的傲慢与偏见
·Windows下一代安全系统重新激活
·快升级!新版Nero刻录火热发布
·未来10年主流,Longhorn不是XP SP3
·AVI电影字幕问题故障处理集萃
·个性演绎:SnagIt在抓图外的妙用
·表情[其他]:荷包蛋表情
·巧劲施妙计:屏保请别骚扰我!
·精彩图解:DIY属于自己的组装QQ
·全力打造IP地理位置最精确的QQ
·推荐:在别人QQ中删除自己
·拒绝单调,妙用QQ表情符号
·开发嵌入式IE浏览器监控程序
·QQ秘密武器:JQQTools3.5新鲜体验
·揭密:LumaQQ如来神掌的实现原理
·望眼欲穿!QQ2005 beta1详尽试用

完美时尚娱乐:2004年腾讯QQ评测大观
精彩无限:MSN Shell4使用指南
亲手制作鲜花情人贺卡送给她
挑战伏明霞?企鹅跳水游戏,看你能得多少分?

新闻搜索
高级搜索
Flash排行榜
·《老鼠爱大米》黑白版
·Take Me To Your Heart
·当你孤单你会想起谁
·别说我的眼泪你无所谓
·下辈子如果我还记得你
·超好玩小游戏!淘金者
·《老鼠爱大米》学生版
·大学自习室继-就说
·光良最新力作-童话
·等你说爱我-如果有一天
热点专题
·全面了解FireFox浏览器
·"麦"进新时代:QQ玩超级语音
·妙手解决多媒体播放的痼疾
·Tom-Skype:分享语聊新体验
·回味:04年软件"开门七件事"
·04年软件八大热点精彩回眸
·欢乐Flash带你畅游圣诞
·优化:打造更好用的WinXP
·十大超人气趣味小游戏
·最受关注补丁SP2横空出世
·寻觅流行IM最爱大决战!
·04十大最动人心扉的情感MV
IT培训十大热门文章
-