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

四、进一步完善

  上面的代码已经基本实现了窗体的自动隐藏效果,但是我在介绍代码的时候有两个问题是被提出但没有被解答的。

  首先是为什么触发隐藏时Fanchors中将至少有一个值而不多于两个值呢?注意代码中对Fanchors的赋值是通过四个判断进行的,那么如果触发隐藏的话,Fanchors中将毫无疑问会有一个值存在,但这种情况是针对隐藏发生在屏幕的四边而言。当窗体被推入到屏幕的四角时,那么Fanchors中便将会有两个值存在。那此时窗体会隐藏到什么地方呢?

  实际的效果告诉我们,窗体会被隐藏到屏幕的四角上。此时若我们试图让窗体重新显示,你便会发现窗体在不断的闪烁。为什么呢?这就是第二个问题提出的原因了。因为对窗体显示或隐藏的处理是根据Fanchors中的值作出的。当Fanchors中有两个值的时候,就将会引发对窗体属性的两次设置。而因为设置语句只有顺序差异而没有优先级差异,那么OnTimer事件中每次都会对窗体进行两次的属性值设置,从而导致我们看到闪烁的显示效果。

  怎么去解决这个问题呢?我们再观察一下QQ的处理。在2003 II版的QQ里面,窗体的隐藏效果作了一定的调整:当窗体在屏幕左右两边隐藏时,它会自动充满屏幕的左右两边且高度不可改变;当窗体脱离屏幕两边的隐藏区域后,窗体的大小会恢复为隐藏前的大小。(注意:窗体并非是完全充满屏幕的两边。QQ在处理这个效果时可能只注意了系统工具栏总在最前显示且位于屏幕下方的情况,所以其充满的区域也只是屏幕顶端到系统工具栏上方的一段空间。)这样的处理可以令窗体即使被推入到屏幕四角,也可以保证只会对其中的一个隐藏方向进行处理,从而避免了前面出现的闪烁现象。

  结合前面的分析,要实现如上的效果还是从拦截WM_MOVING消息入手。重写后的WMMOVING过程如下:

procedure TForm1.WMMOVING(var Msg: TMessage);
begin 
 inherited; 
 with PRect(Msg.LParam)^ do
 begin 
   if (akLeft in FAnchors) or (akRight in FAnchors) then
   begin
     if (Left > 0) and (Right < Screen.Width) then
     begin
       if rec_Position then
       begin
         Bottom := top + Lst_Height;
         Right := Left + Lst_Width;
         Height := Lst_Height;
         Width := Lst_Width;
       end;
     end else
     begin
       SetBarHeight;
       Top := Cur_Top;
       Bottom := Cur_Bottom;
       exit;
     end;
   end;
   Left := Min(Max(0, Left), Screen.Width - Width);
……
   if not Rec_Position then
   begin
     Lst_Height := form1.Height;
     Lst_Width := form1.width;
   end;
   FAnchors := [];
……
   if (akLeft in FAnchors) or (akRight in FAnchors) then
   begin
     Rec_Position := True;
     SetBarHeight;
     Top := Cur_Top;
     Bottom := Cur_Bottom;
   end else
     Rec_Position := False;
   Timer1.Enabled := FAnchors <> []; 
  end;
end;

[上一页] [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培训十大热门文章
-