.版本 2
.程序集 窗口程序集_窗口1
.子程序 _窗口1_创建完毕
.局部变量 hWnd, 整数型
hWnd = 取窗口句柄 ()
SetPropA (hWnd, “proc”, SetWindowLongW (hWnd, #GWL_WNDPROC, 到整数 (&WndProc))) ' 必须要子类化,不然实现不了
.子程序 WndProc, 整数型, , 窗口消息过程
.参数 hWnd, 整数型
.参数 uMsg, 整数型
.参数 wParam, 整数型
.参数 lParam, 整数型
.局部变量 minLeft, 整数型, , , 最小左边
.局部变量 maxLeft, 整数型, , , 最大左边
.局部变量 minTop, 整数型, , , 最小顶边
.局部变量 maxTop, 整数型, , , 最大顶边
.局部变量 minWidth, 整数型, , , 最小宽度
.局部变量 maxWidth, 整数型, , , 最大宽度
.局部变量 minHeight, 整数型, , , 最小高度
.局部变量 maxHeight, 整数型, , , 最大高度
.局部变量 nTmp, 整数型, , , 临时变量,记录读取出来的值
.判断开始 (uMsg = #WM_WINDOWPOSCHANGING)
.如果真 (选择框1.选中)
' lParam 是 WINDOWPOS 结构,结构成员如下
' 0 hWnd 窗口句柄
' 4 hWndInsertAfter 层次 HWND_ 开头常量
' 8 x 左边
' 12 y 顶边
' 16 cx 宽度
' 20 cy 高度
' 24 wFlags 标志SWP_开头常量
minLeft = 到整数 (编辑框_左边最小.内容)
maxLeft = 到整数 (编辑框_左边最大.内容)
minTop = 到整数 (编辑框_顶边最小.内容)
maxTop = 到整数 (编辑框_顶边最大.内容)
minWidth = 到整数 (编辑框_宽度最小.内容)
maxWidth = 到整数 (编辑框_宽度最大.内容)
minHeight = 到整数 (编辑框_高度最小.内容)
maxHeight = 到整数 (编辑框_高度最大.内容)
' __set() __get() 这两个太TM好用了,配合 RtlMoveMemory()使用简直就是万能了
nTmp = __get (lParam, 8) ' 取结构里的第三个成员 0=第一个 4=第二个 8=第三个,因为都是整数,都占用4个字节,后面的一样,就不多说了
.判断开始 (minLeft ≠ -1 且 nTmp < minLeft) ' -1就当作是不限制
__set (lParam, 8, minLeft) ' 超过了我们设置的限制值,那就把限制的值写入到结构里
.判断 (maxLeft ≠ -1 且 nTmp > maxLeft)
__set (lParam, 8, maxLeft)
.默认
.判断结束
' 能看懂一个就能看懂全部,后面的都一样,都是 Ctrl + C - Ctrl + V 然后修改一变量名和写入位置而已
nTmp = __get (lParam, 12)
.判断开始 (minTop ≠ -1 且 nTmp < minTop)
__set (lParam, 12, minTop)
.判断 (maxTop ≠ -1 且 nTmp > maxTop)
__set (lParam, 12, maxTop)
.默认
.判断结束
nTmp = __get (lParam, 16)
.判断开始 (minWidth ≠ -1 且 nTmp < minWidth)
__set (lParam, 16, minWidth)
.判断 (maxWidth ≠ -1 且 nTmp > maxWidth)
__set (lParam, 16, maxWidth)
.默认
.判断结束
nTmp = __get (lParam, 20)
.判断开始 (minHeight ≠ -1 且 nTmp < minHeight)
__set (lParam, 20, minHeight)
.判断 (maxHeight ≠ -1 且 nTmp > maxHeight)
__set (lParam, 20, maxHeight)
.默认
.判断结束
.如果真结束
返回 (0)
.判断 (uMsg = #WM_WINDOWPOSCHANGED)
' lParam 是 WINDOWPOS 结构,结构成员如下
' 0 hWnd 窗口句柄
' 4 hWndInsertAfter 层次 HWND_ 开头常量
' 8 x 左边
' 12 y 顶边
' 16 cx 宽度
' 20 cy 高度
' 24 wFlags 标志SWP_开头常量
输出调试文本 (“左边:” + 到文本 (__get (lParam, 8)) + “ | 顶边:” + 到文本 (__get (lParam, 12)) + “ | 宽度:” + 到文本 (__get (lParam, 16)) + “ | 高度:” + 到文本 (__get (lParam, 20)) + “ | 读 lParam 这个内存地址的值”)
输出调试文本 (“左边:” + 到文本 (窗口1.左边) + “ | 顶边:” + 到文本 (窗口1.顶边) + “ | 宽度:” + 到文本 (窗口1.宽度) + “ | 高度:” + 到文本 (窗口1.高度) + “ | 读窗口左顶宽高的值”)
' 两个输出都是一样的
返回 (0)
.默认
.判断结束
返回 (CallWindowProcW (GetPropA (hWnd, “proc”), hWnd, uMsg, wParam, lParam))
.子程序 __set, 整数型, , 请确保指针的合法性,写到内存
.参数 lpAddr, 整数型, , 内存地址
.参数 offset, 整数型, , 偏移
.参数 value, 整数型, , 写入值
置入代码 ({ 139, 93, 8, 139, 77, 12, 139, 4, 25, 139, 85, 16, 137, 20, 25, 201, 194, 12, 0 })
' mov ebx,[ebp+8]
' mov ecx,[ebp+12]
' mov eax,[ebx+ecx]
' mov edx,[ebp+16]
' mov [ebx+ecx],edx
' leave
' ret 12
返回 (0)
.子程序 __get, 整数型, , 请确保指针的合法性,读取内存
.参数 lpAddr, 整数型, , 内存地址
.参数 offset, 整数型, , 偏移
置入代码 ({ 139, 69, 8, 139, 93, 12, 139, 4, 24, 201, 194, 8, 0 })
' mov eax,[ebp+8]
' mov ebx,[ebp+12]
' mov eax,[eax+ebx]
' leave
' ret 8
返回 (0)
易语言锁定窗口大小
易语言窗口位置
易语言左顶宽高
易语言窗口位置取显示器大小