使用nsDialogs自定义现有的NSIS MUI2页面

问题描述 投票:0回答:1

我想在完成页面中包含自定义控件,具体取决于是否设置了IfRebootFlag,但我不知道为什么其中一些创建但未显示。

$ hWnd为每个添加的控件提供一个数字!= 0,因此这意味着已创建所有控件。控件的位置似乎还可以。肯定不是在左侧图像的后面,因为“左”坐标足够高,可以将控件放置在图像之外。

我尝试了几个小时却不了解这可能是问题所在

;--------------------------------
;Header Files

!include nsDialogs.nsh
!include LogicLib.nsh
!include MUI2.nsh

Name App
OutFile ctmFinishPage.exe
XPStyle on


;--------------------------------
;General

!define MUI_FINISHPAGE_NOREBOOTSUPPORT

;--------------------------------
;Variables

Var hWndChkBoxRunApp
Var hWndChkBoxLinkApp
Var hWndHlineReboot
Var hWndLblReboot
Var hWndRadBtnRebootNow
Var hWndRadBtnRebootLater

Var ctlLeft
Var ctlTop
Var ctlWidht
Var ctlHeight
Var ctlText


;--------------------------------
;Pages

    ;install pages
        !insertmacro MUI_PAGE_INSTFILES

    !define MUI_PAGE_CUSTOMFUNCTION_SHOW MyFinishShow
    !define MUI_PAGE_CUSTOMFUNCTION_LEAVE MyFinishLeave
        !insertmacro MUI_PAGE_FINISH

;--------------------------------
;Languages

  !insertmacro MUI_LANGUAGE "English"


;--------------------------------
;Installer Sections

Section
    SetRebootFlag true
SectionEnd


;--------------------------------
;Functions

Function MyFinishShow
    ;add custom Reboot section to Finish page (MUI_FINISHPAGE_NOREBOOTSUPPORT flag is required)
    IfRebootFlag 0 noreboot
        StrCpy $ctlLeft 120u
        StrCpy $ctlWidht 61%

        StrCpy $0 50
        StrCpy $ctlTop $0u
        StrCpy $R0 10
        StrCpy $ctlHeight $R0u
        StrCpy $ctlText "Create Desktop shortcut"
            ${NSD_CreateCheckBox} $ctlLeft $ctlTop $ctlWidht $ctlHeight $ctlText
                Pop $hWndChkBoxLinkApp
                SetCtlColors $hWndChkBoxLinkApp "" "ffffff"
                ${NSD_SetState} $hWndChkBoxLinkApp ${BST_CHECKED}

        StrCpy $1 117
        StrCpy $ctlTop $1u
        StrCpy $R1 1
        StrCpy $ctlHeight $R1u
        StrCpy $ctlText ""
            ${NSD_CreateHLine} $ctlLeft $ctlTop $ctlWidht $ctlHeight $ctlText
                Pop $hWndHlineReboot

        IntOp $R1 $R1 + 4
        IntOp $2 $1 + $R1
        StrCpy $ctlTop $2u
        StrCpy $R2 25
        StrCpy $ctlHeight $R2u
        StrCpy $ctlText "Your computer must be restarted in order to complete the installation of App. Do you want to reboot now?"
            ${NSD_CreateLabel} $ctlLeft $ctlTop $ctlWidht $ctlHeight $ctlText
                Pop $hWndLblReboot
                SetCtlColors $hWndLblReboot "" "ffffff"

        IntOp $R2 $R2 + 8
        IntOp $3 $2 + $R2
        StrCpy $ctlTop $3u
        StrCpy $R3 10
        StrCpy $ctlHeight $R3u
        StrCpy $ctlText "Reboot now"
        ${NSD_CreateRadioButton} $ctlLeft $ctlTop $ctlWidht $ctlHeight $ctlText
            Pop $hWndRadBtnRebootNow
            SetCtlColors $hWndRadBtnRebootNow "" "ffffff"
            ${NSD_SetState} $hWndRadBtnRebootNow ${BST_CHECKED}

        IntOp $R3 $R3 + 9
        IntOp $4 $3 + $R3
        StrCpy $ctlTop $4u
        StrCpy $R4 10
        StrCpy $ctlHeight $R4u
        StrCpy $ctlText "I want to manually reboot later"
        ${NSD_CreateRadioButton} $ctlLeft $ctlTop $ctlWidht $ctlHeight $ctlText
            Pop $hWndRadBtnRebootLater
            SetCtlColors $hWndRadBtnRebootLater "" "ffffff"
            ${NSD_SetState} $hWndRadBtnRebootLater ${BST_UNCHECKED}

        ${NSD_OnChange} $hWndChkBoxLinkApp ToggleChkBoxState
        ${NSD_OnChange} $hWndRadBtnRebootNow ToggleRadBtnState
        ${NSD_OnChange} $hWndRadBtnRebootLater ToggleRadBtnState

        Goto end
    noreboot:
            StrCpy $ctlLeft 120u
        StrCpy $ctlWidht 61%

        StrCpy $0 110
        StrCpy $ctlTop $0u
        StrCpy $R0 10
        StrCpy $ctlHeight $R0u
        StrCpy $ctlText "Run App"
            ${NSD_CreateCheckBox} $ctlLeft $ctlTop $ctlWidht $ctlHeight $ctlText
                Pop $hWndChkBoxRunApp
                SetCtlColors $hWndChkBoxRunApp "" "ffffff"
                ${NSD_SetState} $hWndChkBoxRunApp ${BST_UNCHECKED}

        IntOp $R0 $R0 + 9
        IntOp $1 $0 + $R0
        StrCpy $ctlTop $1u
        StrCpy $R1 10
        StrCpy $ctlHeight $R1u
        StrCpy $ctlText "Create Desktop"
            ${NSD_CreateCheckBox} $ctlLeft $ctlTop $ctlWidht $ctlHeight $ctlText
                Pop $hWndChkBoxLinkApp
                SetCtlColors $hWndChkBoxLinkApp "" "ffffff"
                ${NSD_SetState} $hWndChkBoxLinkApp ${BST_CHECKED}

        ${NSD_OnChange} $hWndChkBoxRunApp ToggleChkBoxState
        ${NSD_OnChange} $hWndChkBoxLinkApp ToggleChkBoxState
    end:
FunctionEnd

Function MyFinishLeave
    ;reboot the PC if radio button for "Reboot Now" option is checked (MUI_FINISHPAGE_NOREBOOTSUPPORT flag needed)
    IfRebootFlag 0 noreboot
        ${NSD_GetState} $hWndChkBoxLinkApp $0
            ${If} $0 == ${BST_CHECKED}
                Call CreateDesktopShortcut
            ${EndIf}

        ${NSD_GetState} $hWndRadBtnRebootNow $0
            ${If} $0 == ${BST_CHECKED}
                ;Reboot
                MessageBox MB_OK "Reboot..."
            ${EndIf}
        Goto end
    noreboot:
        ${NSD_GetState} $hWndChkBoxRunApp $0
            ${If} $0 == ${BST_CHECKED}
                Call LaunchAppFile
            ${EndIf}

        ${NSD_GetState} $hWndChkBoxLinkApp $0
            ${If} $0 == ${BST_CHECKED}
                Call CreateDesktopShortcut
            ${EndIf}
    end:
FunctionEnd

Function ToggleChkBoxState
    ;manage Reboot radio buttons state. If one is checked, the other one is not checked and the other way around
    Pop $1      ;$1 = $hWndChkBoxRunApp/LinkApp

    ${NSD_GetState} $1 $0
        ${If} $0 == ${BST_CHECKED}
            ${NSD_SetState} $1 ${BST_UNCHECKED}
        ${Else}
            ${NSD_SetState} $1 ${BST_CHECKED}
        ${EndIf}
FunctionEnd

Function ToggleRadBtnState
    ;manage Reboot radio buttons state. If one is checked, the other one is not checked and the other way around
    Pop $1      ;$1 = $hWndRadBtnRebootNow/Later

    ${NSD_GetState} $1 $0
        ${If} $0 == ${BST_CHECKED}
            ${If} $1 == $hWndRadBtnRebootNow
                ${NSD_SetState} $hWndRadBtnRebootLater ${BST_UNCHECKED}
            ${Else}
                ${NSD_SetState} $hWndRadBtnRebootNow ${BST_UNCHECKED}
            ${EndIf}
        ${Else}
            ${If} $1 == $hWndRadBtnRebootNow
                ${NSD_SetState} $hWndRadBtnRebootLater ${BST_CHECKED}
            ${Else}
                ${NSD_SetState} $hWndRadBtnRebootNow ${BST_CHECKED}
            ${EndIf}
        ${EndIf}
FunctionEnd

Function LaunchAppFile
    ;create a file batch at runtime for launching an excel instance pointing to the App file name
    MessageBox MB_OK "App launched at runtime..."
FunctionEnd

Function CreateDesktopShortcut
    ;create App shortcut on DESKTOP folder with custom icon
    MessageBox MB_OK "Desktop Shortcut created..."
FunctionEnd

显示完成页面时未收到错误消息

编辑:使用User32 :: SetWindowPos API函数解决,以修改自定义控件的Z顺序

!define HWND_TOP 0
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002

System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($hWndCtmCtl, ${HWND_TOP}, 0, 0, 0, 0, ${SWP_NOSIZE}|${SWP_NOMOVE})"
nsis nsdialogs
1个回答
0
投票

$mui.FinishPage.Text带有${MUI_FINISHPAGE_TEXT}文本的MUI静态控件显示在某些控件的顶部。

隐藏与

Function MyFinishShow
ShowWindow $mui.FinishPage.Text 0
...

或者如果要保留文本并查看其下方的控件,请使其透明。如果要保留文本,以使它们不重叠,则必须将复选框向下移动一点。

Function MyFinishShow
SetCtlColors $mui.FinishPage.Text "${MUI_TEXTCOLOR}" transparent
...
© www.soinside.com 2019 - 2024. All rights reserved.