如何在NSIS中居中UI并让控件适配1280×720分辨率?
NSIS MUI_PAGE_COMPONENTS 窗口适配解决方案
你的代码存在语法错误(System::Call行重复了MoveWindow调用),且仅调整了窗口大小,未处理内部控件的布局。要实现组件框和描述框的拉伸/居中,需要手动获取对应控件句柄并调用Windows API调整,以下是具体实现:
修正后的完整代码
!define WIDTH 1280 !define HEIGHT 720 Function .onGUIInit ; 调整主安装窗口大小 System::Call 'user32::MoveWindow(i $HWNDPARENT, i 0, i 0, i ${WIDTH}, i ${HEIGHT}, i 1)' ; 获取组件页面的根容器控件(ID 1000) GetDlgItem $0 $HWNDPARENT 1000 ; 让根容器铺满整个主窗口 System::Call 'user32::MoveWindow(i $0, i 0, i 0, i ${WIDTH}, i ${HEIGHT}, i 1)' ; 获取组件列表框(ID 1001)和描述文本框(ID 1002)的句柄 GetDlgItem $1 $0 1001 GetDlgItem $2 $0 1002 ; 计算控件尺寸:适配1280×720窗口,预留边距和标题栏空间 IntOp $listWidth ${WIDTH} * 60 / 100 ; 列表框占窗口宽度60% IntOp $descWidth ${WIDTH} - $listWidth - 30 ; 描述框占剩余宽度,预留30px间距 IntOp $ctrlHeight ${HEIGHT} - 80 ; 控件高度减去顶部标题栏的80px高度 ; 调整组件列表框位置与大小:左上角偏移(10,60) System::Call 'user32::MoveWindow(i $1, i 10, i 60, i $listWidth, i $ctrlHeight, i 1)' ; 调整描述框位置与大小:与列表框间隔30px,顶部对齐 System::Call 'user32::MoveWindow(i $2, i $listWidth + 30, i 60, i $descWidth, i $ctrlHeight, i 1)' FunctionEnd
关键说明
- MUI_PAGE_COMPONENTS的控件有固定ID:根容器为
1000,组件列表框为1001,描述文本框为1002,可通过GetDlgItem获取对应句柄。 - NSIS MUI的默认布局是静态的,没有一键拉伸整个表单的简便方法,必须手动调整每个控件的位置和尺寸。
- 代码中的边距、标题栏高度数值(如
80、10)可根据实际显示效果微调,确保控件布局美观。 - 若需要支持窗口拖拽缩放,还需额外处理
WM_SIZE消息,在窗口大小变化时重新计算控件尺寸。
内容的提问来源于stack exchange,提问作者MilkRen
相关产品推荐
相关产品推荐

