正在阅读:制作类似WinAmp一样的“磁性”窗口制作类似WinAmp一样的“磁性”窗口

2004-04-05 10:08 出处:delphi精髓网 作者:delphi精髓 责任编辑:sdq

  别急着,看Magnetize()过程,先来了解一下修正坐标的原理。根据对Winamp实现效果的观察,我斗胆给所谓“磁化”下一个简单的定义,就是“在原窗口与目标窗口接近到某种预定程度,通过修正原窗口的坐标,使两窗口处于同一平面且具有公共边的过程”。依此定义,我设计了以下的“磁化”步骤。
  
  第一步,判断目标窗口(即Winamp)和我们的Form1在水平及垂直方向上的投影线是否重叠。“某方向投影线有重叠”是“需要进行坐标修正”的必要非充分条件。判断依据是两投影线段最右与最左边界的差减去它们宽度和的值的正负。
  第二步,判断两窗口对应边界是否靠得足够近了。肯定的话就让它们合拢。
           
  好了,下面便是“神秘”的Magnetize过程了……
              
     procedure TForm1.Magnetize(var nl,nt:integer);
               //内嵌两个比大小的函数
               function Min(a,b:integer):integer;
               begin
               if a>b then result:=b else result:=a;
               end;
               function Max(a,b:integer):integer;
               begin
               if a    end;
              var
               H_Overlapped,V_Overlapped:boolean; //记录投影线是否重叠
               tw,ww,wh:integer; //临时变量
              const
               MagneticForce:integer=50; //“磁力”的大小。
               //准确的说,就是控制窗口边缘至多相距多少像素时需要修正坐标
               //为了演示,这里用一个比较夸张的数字--50。
               //一般可以用20左右,那样比较接近Winamp的效果
              begin
              //判断水平方向是否有重叠投影
              ww := WinampRect.Right-WinampRect.Left;
              tw := Max(WinampRect.Right,nl+Width)-Min(WinampRect.Left,nl);
              H_Overlapped := tw<=(Width+ww);
              //再判断垂直方向
              wh := WinampRect.Bottom-WinampRect.Top;
              tw := Max(WinampRect.Bottom,nt+Height)-Min(WinampRect.Top,nt);
              V_Overlapped := tw<=(Height+wh);
              //足够接近的话就调整坐标
              if H_Overlapped then
               begin
               if Abs(WinampRect.Bottom-nt)   
            else if Abs(nt+Height-WinampRect.Top)   
            end;
              if V_Overlapped then
               begin
               if Abs(WinampRect.Right-nl)   
            else if Abs(nl+Width-WinampRect.Left)   
            end;
              end;
              
  怎么样?运行后效果不错吧!
  我设计的一个卡拉OK插件就应用了这种技术,你可以到http://www.lotof.com/lyrics去下载它作为参考。


察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:
键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品