2017-04-05 4 views
0

Ich bin auf der Suche nach einem Standard-Kontrollkästchen für die Standard-Verzeichnisseite mit MUI_PAGE_CUSTOMFUNCTION_SHOW in NSIS. Das Kontrollkästchen scheint jedoch nicht zu erscheinen oder in irgendeiner Weise zu funktionieren. Hier sind die verschiedenen Funktionen, die ich versucht habe; Ich bin mir nicht sicher, ob ich das aktuelle Fenster greifen muss, um daran zu zeichnen? Jeder Rat würde sehr geschätzt werden.Checkbox in NSIS

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "DirectoryShow" 
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "DirectoryLeave" 
!insertmacro MUI_PAGE_DIRECTORY 

Var Checkbox 

Function DirectoryShow 
    ${NSD_CreateCheckbox} 0 0 50% 6% "CheckboxTest" 
    Pop $Checkbox 
    ${NSD_Check} $Checkbox 
FunctionEnd 

Function DirectoryLeave 
    ${NSD_GetState} $Checkbox $0 
    ${If} $0 <> 0 
    MessageBox mb_ok "Checkbox checked." 
    ${EndIf} 
FunctionEnd 
+0

Ich denke, dass Ihre Checkbox falsche x, y oder illegale Größe hat. Schauen Sie auf meine Definition - \t $ {NSD_CreateCheckbox} 50 193 350 8u $ (DLG_InternetConnectionShortcut) –

+0

Kein solches Glück, sogar verschiedene Koordinaten versuchen. Gibt es eine Möglichkeit, um ausführlich zu drucken, um vielleicht zu sehen, was das Problem sein könnte? – MateoConLechuga

Antwort

1

NSD_Create* nur auf nsDialog Seiten (Willkommen und Fertig MUI Seiten), aber nicht auf einer internen NSIS Seite wie Verzeichnis unterstützt.

Um ein Steuerelement auf internen Seiten zu erstellen, müssen Sie die Windows API-Funktion CreateWindowEx manuell aufrufen. Einige der anderen NSD Helfer Makros können nach wie vor auf diesen Steuerungen:

!include MUI2.nsh 
!include nsDialogs.nsh 
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "DirectoryShow" 
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "DirectoryLeave" 
!insertmacro MUI_PAGE_DIRECTORY 
!insertmacro MUI_PAGE_COMPONENTS 
!insertmacro MUI_PAGE_INSTFILES 
!insertmacro MUI_LANGUAGE English 

Var Checkbox 
Var CheckState ; Stored globally so we remember the choice if the user presses the back button and goes back to our page 
!define CheckHeight 28 

!ifmacrondef _Z= 
!error "NSIS 2.51 or 3.0rc1 or later required!" 
!endif 
!macro CreateNativeControl hParent cls style exstyle x y w h text ; Note: Only supports pixel coordinates 
System::Call 'USER32::CreateWindowEx(i ${exstyle}, t "${cls}", ts, i ${style}, i ${x}, i ${y}, i ${w}, i ${h}, p ${hParent}, i0, i0, i0)p.s' "${text}" 
!macroend 

Function DirectoryShow 
    ; Create some extra space by reducing the height of the top text: 
    System::Call *(i,i,i,i)p.r0 ; NSIS 2.51+ 
    System::Call 'USER32::GetWindowRect(p$mui.DirectoryPage.Text, pr0)' 
    System::Call 'USER32::MapWindowPoints(i0,p$mui.DirectoryPage,p$0,i2)' 
    System::Call '*$0(i.r2,i.r3,i.r4,i.r5)' 
    System::Free $0 
    IntOp $5 $5 - ${CheckHeight} 
    System::Call 'USER32::SetWindowPos(i$mui.DirectoryPage.Text,i,i,i,i$4,i$5,i0x6)' 

    ; Create and initialize the checkbox 
    IntOp $5 $3 + $5 ; y = TextTop + TextHeight 
    !insertmacro CreateNativeControl $mui.DirectoryPage ${__NSD_CheckBox_CLASS} "${__NSD_CheckBox_STYLE}" "${__NSD_CheckBox_EXSTYLE}" 0 $5 300 ${CheckHeight} "CheckboxTest" 
    Pop $Checkbox 
    SendMessage $mui.DirectoryPage ${WM_GETFONT} 0 0 $0 ; Get the dialog font 
    SendMessage $Checkbox ${WM_SETFONT} $0 1 ; and apply it to the new control 
    System::Call 'USER32::SetWindowPos(i$Checkbox,i0,i,i,i,i,i0x33)' ; Make sure it is on top of the tab order 
    ${IfThen} $CheckState == "" ${|} StrCpy $CheckState 1 ${|} ; Set the default if this is our first time 
    ${NSD_SetState} $Checkbox $CheckState 
FunctionEnd 

Function DirectoryLeave 
    ${NSD_GetState} $Checkbox $CheckState 
    ${If} $CheckState <> 0 
    MessageBox mb_ok "Checkbox checked." 
    ${EndIf} 
FunctionEnd 

Alternativ kann anstelle der Steuerung während der Laufzeit zu schaffen Sie nur die aktuelle Seite ändern können (... \ NSIS \ Contrib \ UIs \ modern.exe) mit Resource Hacker und wenden Sie die neue UI-Datei mit MUI_UI (ChangeUI) an