怎样建立磁性窗体(转贴于: :《程序员》2002年第01期)
实现磁性窗体基本上分为两步,第一步是实现当两个窗体靠近到一定距离以内时实现窗体间的粘贴操作,第二步是一定窗体时,同时移动与它粘在一起的其它窗体。实现窗体的粘贴
    实现粘贴的难点在于什么时候进行这个操作,假设有两个窗体Form1和Form2,移动Form2向Form1靠近,当Form2与Form1的最近距离小于distance时粘贴在一起。显然,应该在移动Form2的过程中进行判断,问题是在程序的什么位置插入判断代码呢?
合理的方法是利用系统产生的消息,但是利用什么消息呢?窗体在移动时会产生WM_WINDOWPOSCHANGING和WM_MOVING消息,移动结束后会产生WM_WINDOWPOSCHANGED和WM_MOVE消息。WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息的参数lParam是结构WINDOWPOS的指针,WINDOWPOS定义如下:
    typedef struct _WINDOWPOS {
        HWND hwnd; // 窗口句炳
        HWND hwndInsertAfter; // 窗口的Z顺序
        int  x; // 窗口x坐标
        int  y; // 窗口的y坐标
        int  cx; // 窗口的宽度
        int  cy; // 窗口的高度
        UINT flags; // 标志位,根据它设定窗口的位置
    } WINDOWPOS;
    可以看出,WM_WINDOWPOSCHANGED消息不仅仅在窗口移动时产生,而且在它的Z顺序发生变化时产生,包括窗口的显示和隐藏。所以我认为这个消息不是最佳选择。
    WM_MOVING和WM_MOVE消息的参数lParam是一个RECT结构指针,与WM_WINDOWPOSCHANGED消息相比较为单纯,我采用的即是这个消息。
-----------------------------
用"磁性窗体",到google找,很多. 
有了以上的东西,用C# 的unsafe code ,调用API,不难实现.
■■■■■ To teach a fish how to swim. ■■■■■

解决方案 »

  1.   

    对不起,贴错地方了,
    ■■■■■ To teach a fish how to swim. ■■■■■
      

  2.   

    参考这2篇最新的源码(转贴于: www.aspxcn.com)源码名称:不规则窗体生成器(国产源码) 
     开发语言:winform 
     推荐等级:★★★★★ 
     源码大小:52KB http://www.aspxcn.com/dotnetdown/show.aspx?id=326源码名称:制作不规则窗体的示例源码 
     开发语言:C# 
     推荐等级:★★★★★ 
     源码大小:26KB 
     更新日期:2002-09-21 
    http://www.aspxcn.com/dotnetdown/show.aspx?id=331这次贴对了.
    ■■■■■ To teach a fish how to swim. ■■■■■
      

  3.   

    hehe ,我有原码和例子.给我你的信箱