|
发表于 2022-9-8 10:21:23
|
显示全部楼层
实现磁性窗体基本上分为两步,第一步是实现当两个窗体靠近到一定距离以内时实现窗体间的粘贴操作,第二步是一定窗体时,同时移动与它粘在一起的其它窗体。
实现窗体的粘贴
实现粘贴的难点在于什么时候进行这个操作,假设有两个窗体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,不难实现
也可以用自动吸附。自动隐藏就是做两个窗口,一个主窗口,一个定位窗口。正常情况下主窗口显示,定位窗口隐藏。当主窗口的位置改动达到隐藏条件时,隐藏主窗口,显示定位窗口。而定位窗口只要接到鼠标消息,马上显示主窗口并隐藏自身,回到正常状态。定位窗的位置固定,不能由用户移动,一般只占据屏幕边很小的地方。
但由于wxPython无法处理非客户区的鼠标事件(也许有人知道,请赐教!),所以你要做无标题栏的……
好了,解答到这里吧,给我个最佳答案,谢谢了
|
|