摘要载入中…    请稍等…












内容载入中…    请稍等…

如长时间看不到内容,请关闭浏览器,重新打开此页!

芯友首页 应用软件 编程开发 网络硬件 资源下载 动漫音乐 精美图库 芯友论坛 视频教程 电脑技术QQ群:72845454
 ★★photoshop学友-史上最强播放器★★
 位置:编程开发>Deiphi>Deiphi窗体文章
◎→ 本类最新
DELPHI动态生成控件
Delphi编程中创建一个启动闪现窗
在win95,win98下实现半透明的窗口
拖动无标题栏窗体的方法
用Delphi 控制窗体的大小
使MDI窗口有一个背景图象或使它平
软件启动画面中启动状态的显示
◎→相关资源
C语言入门视频教程
C#编程WinForm入门视频
Asp.net入门视频教程下载
VC++编程视频教程下载
VB窗体文章
HTML入门教程
Deiphi实例教程
Deiphi窗体文章
Deiphi数据库编程
Deiphi网络编程
Deiphi图形图象文章
Deiphi系统文件
◎→ 热门资源
Delphi拖放编程(2)(1)
Delphi“流”实现文件加密器(3)
Delphi“流”实现文件加密器(2)
Delphi“流”实现文件加密器(1)
Delphi6函数大全(8)(2)
Delphi6函数大全(8)(1)
Delphi6函数大全(12)

Delphi制作的“磁性”窗口


日期:2008-10-20 22:07:14    来源:
   
 ·Delphi拖放编程(2)(1) ·Delphi应用程序中中国式报表的制作
 ·Delphi无标题栏窗口程序设计中鼠标拖动技巧

Delphi制作的“磁性”窗口
  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;
怎么样?运行后效果不错吧  [1]

Delphi“流”实现文件加密器(3)

用Delphi制作动态有声标签

用Delphi7.0实现漂亮的汉字窗口

--->QQ个性头像制作工具 V2007.5.1┊制作出超酷的QQ个性头像┊简体中文绿色免费版
--->Xion Audio Player V1.0.82┊可以自己制作SKIN 的高级播放器┊英文绿色免费版
--->GreenBrowser V4.5.0423 简体中文版┊多窗口多特性的浏览器
--->Gosurf Browser 2.76.704.8178┊最IN多页面多窗口浏览器┊多国语言绿色免费版
--->Avant Browser V11.5 Build 8┊基于IE 内核多窗口浏览器┊多国语言官方便携版
Tags:  Delphi 制作 磁性 窗口

芯友网版权所有 1999-2006 | 著作权与商标声明 | 法律声明 | 服务条款 | 隐私声明 | 联系我们