• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
制作类似WinAmp一样的“磁性”窗口
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
制作类似WinAmp一样的“磁性”窗口
软件发布 制作类似WinAmp一样的“磁性”窗口
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 编程技术 >> Delphi教程 >> 制作类似WinAmp一样的“磁性”窗口

制作类似WinAmp一样的“磁性”窗口

添加时间: 2006-2-26 8:49:14  作者: Delphi教程  阅读次数:76   来源: http://www.d9soft.com

       

  Winamp的用户都知道,Winamp的播放列表或均衡器在被移动的时候,仿佛会受到一股磁力,每当靠近主窗口时就一下子被“吸附”过去,自动沿边对齐。我想让我的Winamp插件也具备这种奇妙特性,于是琢磨出了一种“磁化”窗口的方法。该法适用于Delphi的各个版本。为了演示这种技术,请随我来制作一个会被Winamp“吸引”的样板程序。

  先新建一应用程序项目,把主窗口Form1适当改小些,并将BorderStyle设为bsNone。放一个按钮元件,双击它并在onClick事件中写“Close;”。待会儿就按它来结束程序。现在切换到代码编辑区,定义几个全局变量。
              
     var
     Form1: TForm1; //“磁性”窗口
               LastX, LastY: Integer; //记录前一次的坐标
               WinampRect:TRect; //保存Winamp窗口的矩形区域
               hwnd_Winamp:HWND; //Winamp窗口的控制句柄
              接着编写Form1的onMouseDown和onMouseMove事件。
              procedure TForm1.FormMouseDown(Sender: TObject; Button:
            TMouseButton;
               Shift: TShiftState; X, Y: Integer);
              const
               ClassName=‘Winamp v1.x’; //Winamp主窗口的类名
           //如果改成ClassName=‘TAppBuilder’,你就会发现连Delphi也有引力啦!
              begin
              //记录当前坐标
              LastX := X;
              LastY := Y;
              //查找Winamp
              hwnd_Winamp := FindWindow(ClassName,nil);
              if hwnd_Winamp>0 then //找到的话,记录其窗口区域
              GetWindowRect(hwnd_Winamp, WinampRect);
              end;
              procedure TForm1.FormMouseMove(Sender: TObject; Shift:
            TShiftState; X,
               Y: Integer);
              var
               nLeft,nTop:integer; //记录新位置的临时变量
              begin
              //检查鼠标左键是否按下
               if HiWord(GetAsyncKeyState(VK_LBUTTON)) > 0 then
               begin
               //计算新坐标
               nleft := Left + X - LastX;
               nTop := Top + Y - LastY;
               //如果找到Winamp,就修正以上坐标,产生“磁化”效果
               if hwnd_Winamp>0 then
               Magnetize(nleft,ntop);
               //重设窗口位置
               SetBounds(nLeft,nTop,width,height);
               end;
              end;

  别急着,看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去下载它作为参考。

 

 

上下文章:

 

上一篇文章: 制作真正的TopMost窗口 下一篇文章: 用Delphi和Web Services开发短信应用程序

相关文章:

  • 彻底DIY Vista主题制作教程(上)
  • 教你如何用PhotoImpact 来制作逼真的温度计
  • 用Painter制作手绘风格女孩教程
  • 让电脑裸奔 制作百毒不侵的系统
  • 制作“百毒不侵”的Windows系统

相关软件:

  • 窗口键盘记录器(keylog) V2.0
  • 名片制作专家 6.5.6
  • Flash相册制作大师 2008 V6.1
  • 比特铃手机漫画书制作工具 1.01
  • 图章制作专家 4.89
  • Ozone for Winamp3 1.03

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • Delphi的两个实用技巧(1)播放Flash
  • Delphi的两个实用技巧(2)巧用Wind...
  • delphi实例编程之--制作可随处拖放...
  • 关于VisiBroker For Delphi的使用...
  • 关于VisiBroker For Delphi的使用...
  • 关于VisiBroker For Delphi的使用...
  • 在线播放器DIY
  • Delphi让你发送Flash电子邮件
  • 在窗口标题区添加按钮
  • 用Delphi 6编程实现自动标注汉语拼...

Delphi教程阅读排行

  • Delphi7从入门到精通之历数Delphi...
  • Delphi的两个实用技巧(1)播放Flash
  • Delphi7从入门到精通之认识Delphi...
  • delphi实例编程之--制作可随处拖放...
  • Delphi控件,我们也可以(1)
  • Delphi的两个实用技巧(2)巧用Wind...
  • 在线播放器DIY
  • Delphi控件,我们也可以(2)
  • Spcomm串口控件的例程
  • 用Delphi + DirectX开发简单RPG游...

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • 第二章 PowerBuilder 入门之创建新...
  • VC++之List Box/Check List Box控...
  • 第一章 什么是PowerBuilder
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有