快速业务通道

建立磁性窗体

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
tyle->YStyle!=AS_NONE)
    { // 粘贴成功
      MyStyle->AttachTo= Form->Handle;
    }
    return bool(MyStyle->AttachTo);
   }

函数Do_WM_MOVING在消息循环中处理WM_MOVING时调用,参数My为处理消息的窗体,Msg为消息参数。

// 处理WM_MOVING事件

void Do_WM_MOVING(TForm *My,TMessage &Msg)
   {
    CFormAttachStyle *MyStyle=(CFormAttachStyle *)My->Tag;
    if(MyStyle && MyStyle->Enabled)
    {
      MyStyle->Enabled=false; // 防止重复操作
      RECT *r=(RECT *)Msg.LParam ;
      // 处理粘贴,这里只对粘贴到主窗体进行判断
      TForm *FormApplication->MainForm;
      AttachToForm(My,r,12); // 检查是否可以粘贴窗体
      MyStyle->Enabled=true; // 恢复操作状态
    }
    Msg.Result=0; // 通知系统,消息已经处理
   }

实现窗体的关联移动

与处理窗体粘贴相比,关联窗体的难度小一些。但是从CSDN上的帖子看,采用的方法都单调而且不佳,我都不推荐。

比较直观的方法是使用窗体的MOUSEDOWN、MOUSEMOVE和MOUSEUP事件,先定义一个标志鼠标是否按下的变量:

bool bMouseDown;

在MOUSEDOWN事件中设置:

bMouseDown=true;

在MOUSEUP事件中设置:

bMouseDown=false;

在MOUSEMOVE事件中作如下处理:

if(bMouseDown)
   {
    // 移动当前窗体
    ……
    // 计算窗体移动的位移
    int dx;
    int dy;
    // 计算出dx和dy
    ……
    // 移动其它粘贴到当前窗体的窗体
    ……
   }

这个方法的最明显的问题有两个:1、鼠标在窗体上的控件上按下时,不能收到窗体的MOUSEDOWN和MOUSEUP事件,如果同时监控各个控件的事件,麻烦是相当大的。2、窗口标题栏的鼠标事件难以正常处理。

其实,同上一段落类似,处理窗体的WM_MOVING事件是比较好的方法。即在WM_MOVING事件中同步移动其它窗体。

移动其它窗体的方法也有多种,有人采用发送消息的方式,具体如下:

// dx和dy是当前窗体移动的距离

// hMove是要移动的窗体

// WM_MOVEFORM是自定义的消息

PostMessage(hMove, WM_MOVEFORM,dx,dy);

被移动的窗体处理WM_MOVEFORM消息时,移动自己到新的位置。

如果是VB、Delphi一类的语言,可以直接设置其Left和Top属性。我采用的方法是使用API函数SetWindowPos,该函数重新设置指定窗口的位置。我的参考代码如下:

// 移动被粘贴在一起的其它窗体

void UnionOtherForm(TForm *My,TForm *Form,int dx,int dy)
   {
    if(Form==NULL)return;
    CFormAttachStyle *MyStyle=(CFormAttachStyle *)(Form->Tag);
    if(MyStyle)
    {
      if(MyStyle->Enabled && MyStyle->AttachTo==My)
      {
       MyStyle->Enabled=false;
       int X1=Form->Left;
       int Y1=Form->Top;
       SetWindowPos(Form->Handle,My->Handle,
       X1+dx,Y1+dy,Form->Width,Form->Height,
       SWP_NOSIZE|SWP_NOACTIVATE);
       MyStyle->Enabled=true;
      }
    }
   }
   // 移动被粘贴在一起的其它窗体
   void AdjuctFormPos(TForm *My,RECT *r)
   {
    // 调整窗口位置
    int dy=r->top-My->Top;
    int dx=r->left-My->Left;
    My->Top=r->top;
    My->Left=r->left;
    // 逐一检查创建的窗体
 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号