一、代码核心分析
需求是窗口固定宽度 800、横向排满一行后自动换行
1. 窗口宽度计算
2. 换行逻辑“排满再换行”
3. 第二行纵向位置(atop)计算
4. 只改位置不改大小,窗口宽度不会变成800
二、完整代码(符合“固定800宽、排满自动换行”需求)
. 版本 2
. 子程序 游戏_排列窗口
. 局部变量 apids, 整数型, , "0", 游戏进程数组
. 局部变量 gameNum, 整数型, , , 游戏数量
. 局部变量 hwnds, , , "0", 游戏窗口句柄数组
. 局部变量 hwnd, , , , 当个游戏窗口句柄
. 局部变量 i, 整数型
. 局部变量 窗口宽度, 整数型
. 局部变量 窗口高度, 整数型
. 局部变量 每行数量, 整数型
. 局部变量 列索引, 整数型
. 局部变量 行索引, 整数型
. 局部变量 行间距, 整数型
' ========== 可配置参数 ==========
窗口宽度 = 800 ' 固定窗口宽度
窗口高度 = 600 ' 对应窗口高度,根据实际游戏修改
行间距 = 5 ' 每行之间的间距,可调整
' ================================
' 没找到进程直接返回
. 如果真 (进程_取 ID 数组 (“gamefree.exe”, apids, ) = 0)
返回 ()
. 如果真结束
gameNum = 取数组成员数 (apids)
重定义数组 (hwnds, 假, gameNum)
' 计算一行最多能放几个窗口(排满才换行)
每行数量 = 取整 (取屏幕宽度 () ÷ 窗口宽度)
. 如果真 (每行数量 < 1) ' 屏幕太窄至少放1个
每行数量 = 1
. 如果真结束
. 计次循环首 (gameNum, i)
hwnds [i] = 进程_ID 取窗口句柄 (apids [i], , , , )
hwnd = hwnds [i]
' 计算当前窗口在第几列、第几行(从0开始)
列索引 = (i - 1) % 每行数量
行索引 = (i - 1) ÷ 每行数量
' 延时避免操作过快
程序_延时 (50, )
' 设置窗口位置和大小(固定800宽)
窗口_置位置和大小 (hwnd, 列索引 × 窗口宽度, 行索引 × (窗口高度 + 行间距), 窗口宽度, 窗口高度)
' 激活窗口(保留原有逻辑)
. 如果真 (取反 (窗口_是否激活 (hwnd)))
窗口_置焦点 (hwnd)
窗口_激活 (hwnd)
. 如果真结束
系统_处理事件 ()
. 计次循环尾 ()
三、关键说明
- 固定窗口尺寸:直接定义
窗口宽度=800,不再动态计算,完全符合需求。 - 自动计算每行容量:用
屏幕宽度 ÷ 窗口宽度算出一行能放多少个,真正实现“排满一行再换行”。 - 行列索引计算:通过取模(
%)算列号、整除(÷)算行号,支持任意数量窗口、自动换行。 - 纵向位置自动累加:第二行及以后的 Y 坐标 =
行号 × (窗口高度 + 行间距),逻辑清晰,适配所有分辨率。 - 补全窗口尺寸参数:调用
窗口_置位置和大小时传入宽度和高度,确保窗口真正变成 800 宽。 - 移除错误逻辑:删除了无意义的
×2、错误的atop计算和平分两行的判断。
如果你的游戏窗口高度不是 600,修改代码开头的窗口高度数值即可。