【问题标题】:In NSIS, How to set the size of the dialog box when using nsDialogs::Create 1018?在 NSIS 中,使用 nsDialogs::Create 1018 时如何设置对话框的大小?
【发布时间】:2013-06-21 19:10:17
【问题描述】:

在 Nsis 中,我正在使用:

 ...
 nsDialogs::Create 1018
 Pop $0

 nsDialogs::Show
 ...

但是对话框的大小不符合我的需要。如何为该对话框指定 x 和 y 的长度?

【问题讨论】:

    标签: user-interface dialog size controls nsis


    【解决方案1】:

    如果您想调整所有内容的大小,最好使用 Resource Hacker 和 ChangeUI,但您可以在运行时进行:

    !include nsDialogs.nsh
    
    Function mypage
    System::Call 'user32::SetWindowPos(i$hwndparent,i,i,i,i 640,i 480,i 0x16)' ; Resize outer dialog
    nsDialogs::Create 1018
    Pop $0
    System::Call 'user32::MoveWindow(i$0,i0,i0,i 600,i 200,i0)' ; Resize inner (nsDialogs) page
    
    ${NSD_CreateLabel} 0 10u 100% 10u "Hello, welcome to nsDialogs!"
    Pop $0
    SetCtlColors $0 0xffffff 0xff2255
    
    nsDialogs::Show
    FunctionEnd
    
    page custom mypage
    

    【讨论】:

    • @Andres 它运行良好,除了命令按钮:取消、返回、下一步。它们停留在同一个位置,现在位于对话框的中心。
    • @JoelShemtov 您也必须移动它们(GetDlgItem $0 $hwndparent 1 以获得句柄等),但仅使用 Resource Hacker 更好...
    【解决方案2】:

    我的对话框不够高,无法容纳我放入的所有控件。

    我尝试了您的两个 Windows API,当它们工作时,安装的客户区域重叠并覆盖了确定/取消按钮。

    我最终制定了“使用资源黑客和 ChangeUI”。这比我想象的要难得多。所以,这里有一个更详细的方法。我对 nsDialogs NOT ModernUI 根深蒂固。因此,这是 nsDialogs 调整与示例中相同的窗口大小的方法。上面介绍了 ModernUI。

    nsDialogs::创建 1018

    1. 从 Angus 获取 ResourceHacker:http://www.angusj.com/resourcehacker/
    2. 转到您的 NSIS Contrib 文件夹。 C:\Program Files (x86)\NSIS\Contrib\UIs 并将 default.exe 复制到与 NSI 脚本文件相同的文件夹中。
    3. 将 default.exe 的本地副本重命名为 tall_UI.exe。
    4. 打开 ResourceHacker,将 tall_UI.exe 拖到窗口中。
    5. 使用 treeView 向下挖掘资源 105 并单击 1033。当您单击 1033 时,它会显示预览。
    6. 您拥有的是代码和预览。记下第一行代码...

      105 DIALOGEX 0, 0, 280, 162
      
    7. 现在单击预览窗口的顶部边缘并将其拉伸以使其更高。请注意,该行中的最终数字变大了。注意现在窗口底部有多少空白空间。
    8. 对话框底部有四个控件:一个按钮、一个不可见框和另外两个按钮。将所有这些向下拖动到窗口底部附近。当您选择每一个时,您会注意到代码窗口中正在修改哪个控件的红色 * 标记。只需让它们靠近您想要的位置即可。
    9. 移动水平分隔线。它很瘦,很难移动。
    10. 你会希望你的按钮都在一条直线上。为了让它们准确无误,请移至代码窗口并为每个控件编辑从行尾开始的第三个数字。要将这些更改应用到代码窗口,请单击“编译脚本”。
    11. 单击灰色大框进行选择,然后使用其底部边缘点将其拉伸至所需高度。
    12. 调整代码或预览。经常点击编译。
    13. 完美,您喜欢。最后一次点击编译。
    14. 单击“文件”和“保存”。它将保存您的 Tall_UI.exe 并制作一个名为 Tall_UI_original.exe 的副本。
    15. 在您的 NSIS 脚本中,您需要尽早添加对 ChangeAll 的调用。

      ChangeUI all tall_UI.exe
      Page custom nsDialogsPage
      
      Function nsDialogsPage
          nsDialogs::Create 1018 
          Pop $Dialog
          ...
      

    这对我有用。你会做一些试验和错误,总是点击编译并保存在 ResourceHacker 中,然后重建你的 NSI。您可能会注意到您的对话框比 ResourceHacker 中显示的预览更大或更小。那是因为 NSIS 确实会根据字体大小、DPI ……诸如此类的东西来缩放您的对话框。尝试并重试,直到看起来不错。

    你会注意到 nsDialogs::Create 1018 匹配资源黑客第 5 行中的数字:

    CONTROL "", 1018, STATIC, SS_BLACKRECT | WS_CHILD | WS_GROUP, 7, 7, 266, 160  
    

    我把这个演示放在一起后做了一些测试,那个 1018 资源的位置和大小确实有影响,但我不能告诉你为什么它不是黑色的。

    我的演示的完整代码如下所示。

    #Created with NSIS version 2.46 downloaded from SourceForge.net
    #Based on "Adding Controls" section of user docs
    # http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html#step-add
    
    !include nsDialogs.nsh
    
    Name "Launchpad"
    OutFile "Master Installer.exe"
    BrandingText " "
    Caption "Launchpad"
    RequestExecutionLevel admin
    SetFont "Arial" 10
    VIProductVersion "2.5.0.0"
    
    Var Dialog
    Var Button
    
    ChangeUI all tall_UI.exe
    Page custom nsDialogsPage
    
    Function nsDialogsPage
        nsDialogs::Create 1018 
        Pop $Dialog
    
        # It will create a new dialog in the page and return its HWND on the stack. The result must be popped from the stack to prevent stack corruption. If the result is error, the dialog couldn't be created.
        ${If} $Dialog == error
        Abort
        ${EndIf}
    
        # ${NSD_Create*} x y width height text
    
        ## Going to use $0 for y of each new control.
        StrCpy $0 "29"
    
        ${NSD_CreateButton} 50% "$1u" 25% 12u "Product Manual"
        Pop $Button
        ${NSD_OnClick} $Button Manual_Install_Clicked
        IntOp $0 $0 + 18
        IntOp $1 $0 - 2
    
        ${NSD_CreateButton} 50% "$1u" 25% 12u "Product 1 Installer"
        Pop $Button
        ${NSD_OnClick} $Button Product1_Install_Clicked
        IntOp $0 $0 + 18
        IntOp $1 $0 - 2
    
        ${NSD_CreateButton} 50% "$1u" 25% 12u "Product 2 Installer"
        Pop $Button
        ## ${NSD_OnClick} ...
        IntOp $0 $0 + 18
        IntOp $1 $0 - 2
    
        ${NSD_CreateButton} 50% "$1u" 25% 12u "Product 3 Installer"
        Pop $Button
        ## ${NSD_OnClick} ...
        IntOp $0 $0 + 18
        IntOp $1 $0 - 2
    
        ${NSD_CreateButton} 50% "$1u" 25% 12u "Product 4 Installer"
        Pop $Button
        ## ${NSD_OnClick} ...
        IntOp $0 $0 + 18
        IntOp $1 $0 - 2
    
        ${NSD_CreateButton} 50% "$1u" 25% 12u "Product 1 Installer"
        Pop $Button
        ## ${NSD_OnClick} ...
        IntOp $0 $0 + 18
        IntOp $1 $0 - 2
    
        ${NSD_CreateButton} 50% "$1u" 25% 12u "Product 1 Installer"
        Pop $Button
        ## ${NSD_OnClick} ...
        IntOp $0 $0 + 18
        IntOp $1 $0 - 2
    
        nsDialogs::Show
    FunctionEnd
    
    Function ExecInstall
        pop $0
        ExecWait $0 $1
        IfErrors 0 ExecDone
        MessageBox MB_OK|MB_IconExclamation "$1 $0 not found"
        ExecDone:
        ##Call Update_Install_Statuses
    FunctionEnd
    
    Function Manual_Install_Clicked
        ExecShell "open" "$EXEDIR\Manual\Manual.PDF"
    FunctionEnd
    
    Function Product1_Install_Clicked
        Exec "Explorer.exe $EXEDIR\Support Files"
    FunctionEnd
    
    Function Product2_Install_Clicked
        Push "$EXEDIR\Product2 Folder\Product2 Installer.exe"
        Call ExecInstall
    FunctionEnd
    
    Section
    
    SectionEnd
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 2013-09-17
      相关资源
      最近更新 更多