你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / C专栏
建立磁性窗体(3)
 
函数DistanceIn用于判断两个整数的距离是否在指定范围内:

  // 整数i1和i2的差的绝对值小于i3
   bool DistanceIn(unsigned int i1,unsigned int i2,unsigned int i3)
   {
    if(i1>i2)
    { // 确保i2>=i1;
    int t=i1;
    i1=i2;
    i2=t;
    }
    return i2-i1<=i3;
   }
   //---------------------------------------------------------------------------
   // i1<=i2   bool Mid(unsigned int i1,unsigned int i2,unsigned int i3)
   {
    return ((i1<=i2) && (i2   }
   //---------------------------------------------------------------------------

  AttachToForm是处理窗体粘贴的关键函数,如果进行了粘贴,则保存粘贴到的窗体的句柄,并调整窗体的位置。在函数中使用了窗体的Tag属性保存了一个CFormAttachStyle类的实例指针,原因将在稍后进行说明,参数distance表示可以进行粘贴的距离。窗口粘贴在上下、左右各有3种形式,都需要加以判断。

  // 把窗体My粘到主窗体上

  bool AttachToForm(TForm *My, TForm *Form, RECT *r,int distance)
   {
    CFormAttachStyle *MyStyle=(CFormAttachStyle *)My->Tag;
    if(MyStyle==NULL)return false; // 这个窗体不支持粘贴
    //准备粘贴到的窗体的位置
    RECT rMain;
    GetWindowRect(Form->Handle,&rMain);
    MyStyle->AttachTo=NULL;
    MyStyle->yPos=r->top;
    MyStyle->xPos=r->left;
    // 上下方向判断
    MyStyle->YStyle=AS_NONE;
    if( Mid(rMain.left,r->left,rMain.right)
      || Mid(r->left,rMain.left,r->right)
      || (MyStyle->XStyle!=AS_NONE))
    {
      if(DistanceIn(r->top,rMain.bottom,space))
      {
       MyStyle->YStyle=AS_BOTTOM;
       MyStyle->yPos=rMain.bottom;
      }else if(DistanceIn(r->top,rMain.top,space))
      {
       MyStyle->YStyle=AS_TOP;
       MyStyle->yPos=rMain.top;
      }else if(DistanceIn(r->bottom,rMain.top,space))
      {
       MyStyle->YStyle=AS_T_TOP;
       MyStyle->yPos=rMain.top-(r->bottom-r->top);
      }
    }
    // 左右方向判断
    MyStyle->XStyle=AS_NONE;
    if( Mid(rMain.top,r->top,rMain.bottom)
      || Mid(r->top,rMain.top,r->bottom)
      || (MyStyle->YStyle!=AS_NONE))
    {
      if(DistanceIn(r->left,rMain.left,space))
      {
       MyStyle->XStyle=AS_LEFT;
       MyStyle->xPos=rMain.left;
      }else if(DistanceIn(r->left,rMain.right,space))
      {
       MyStyle->XStyle=AS_RIGHT;
       MyStyle->xPos=rMain.right;
      }else if(DistanceIn(r->right,rMain.left,space))
      {
       MyStyle->XStyle=AS_L_LEFT;
       MyStyle->xPos=rMain.left-(r->right-r->left);
      }
    }
    My->Left=MyStyle->xPos;
    My->Top=MyStyle->yPos;
    if(MyStyle->XStyle!=AS_NONE || MyStyle->YStyle!=AS_NONE)
    { // 粘贴成功
      MyStyle->AttachTo= Form->Handle;
    }
    return bool(MyStyle->AttachTo);
   }

(编辑:aniston)

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089