You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:43:19