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消息相比较为单纯,我采用的即是这个消息。下面我给出用C++ Builder写的示例程序。
为了方便程序的阅读,先定义了一个枚举数据类型,表示窗体的粘贴状态。同时定义了一个类,封装了窗体粘贴相关的数据,其中的Enable是为了防止重复进行操作,方法是操作时设置Enable为否,操作结束时恢复为真,而在操作前检查这个标志是否为否,否则直接返回。
图2 窗体的粘贴状态示例
// 窗体粘贴状态,含义见图2 enum enumAttachStyle { AS_NONE, // 没有粘贴 AS_TOP, AS_BOTTOM, AS_T_TOP, AS_LEFT, AS_RIGHT, AS_L_LEFT }; // 处理窗体粘贴的类,为了简化,采用了public声明 class CFormAttachStyle { public: bool Enabled; // 防止重复进行粘贴相关的操作 HWND AttachTo; // 被粘贴到哪个窗口 int XStyle; // 左右方向的粘贴状态 int YStyle; // 上下方向的粘贴状态 int xPos; // 粘贴到的x坐标 int yPos; // 粘贴到的y坐标 CFormAttachStyle() // 初使化数据 { XStyle =AS_NONE; YStyle =AS_NONE; Enabled=true; hAttachTo=NULL; } };
(编辑:aniston)
|