函数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 …… // 移动其它粘贴到当前窗体的窗体 …… }
(编辑:aniston)
|