首页 > 解决方案 > 调整 MUI2 的组件大小

问题描述

实际上,我正在尝试更改以下页面的 MUI2 组件的组件大小: !insertmacro MUI_PAGE_LICENSE !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH

我还添加了自定义函数来更改每个窗口的大小,使用 nsResize 插件。现在我遇到的问题是组件在宽度和高度上放错地方并且很小。

我搜索了它,并为我的问题找到了一些想法。但出于几个个人原因,我不想使用 resourcehacker 来创建新的 UI。我看到我可以使用系统插件来进行调整,但是信息源让我不知所措。

然后我试图自己执行它并失败了。我的实际解决方案是:

Function .myGuiInt
  System::Call "user32::GetClientRect(i #32770 , i r1)"
  System::Call "user32::SetWindowPos(i 1000, i, i, i 15000, i, i)"
  ....
FunctionEnd

我试图更改设置许可证的文本框的大小。但我没有任何效果,我怎样才能使这个调用我可以影响 UI?

标签: nsis

解决方案


组件页面的简单解决方案是!define MUI_COMPONENTSPAGE_SMALLDESCMUI_COMPONENTSPAGE_NODESC,这将使组件列表更大。

如果这还不够大,那么绝对最好的解决方案是创建自己的 UI。您将不得不使用 Resource Hacker 或其他一些 .EXE 编辑器来执行此操作,但这是一次性操作,您不必重新分发编辑器,只需生成的 UI 文件以及您的 .NSI 如果其他人也需要编译您的安装程序。获取...NSIS\Contrib\UIs\modern.exe并编辑它以满足您的需求,然后将其应用于MUI_UI(或ChangeUI用于经典安装程序)。

这样做的好处是您将使用对话单元,而不是像素,并且也不需要编程技能。

最后的选择是在运行时进行。这意味着您将在大多数时间以像素为单位工作,因此您不应该真正对任何尺寸进行硬编码。要使用系统插件,您必须熟悉 Win32 编程。了解 C/C++ 或其他一些低级编程语言也有帮助。

!include MUI2.nsh
!insertmacro MUI_PAGE_WELCOME
!define MUI_COMPONENTSPAGE_NODESC
!define MUI_PAGE_CUSTOMFUNCTION_SHOW fullsize_tweak_components_page
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

!define /ifndef SWP_NOZORDER 4
!define /ifndef SWP_NOACTIVATE 0x10
Function fullsize_tweak_components_page
System::Call 'USER32::GetClientRect(p $mui.ComponentsPage, @ r0)' ; Get the size of the inner dialog
System::Call '*$0(i,i,i.r3,i.r4)' ; Extract the right and bottom members from RECT
System::Call 'USER32::SetWindowPos(p $mui.ComponentsPage.Components, p 0, i 0, i 0, i $3, i $4, i ${SWP_NOZORDER}|${SWP_NOACTIVATE})' ; Resize the components list
FunctionEnd

推荐阅读