函数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)
|