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
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) –
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