NSIS 中的复选框
Checkbox in NSIS
我希望在 NSIS 中使用 MUI_PAGE_CUSTOMFUNCTION_SHOW
将基本复选框添加到默认目录页面。但是,该复选框似乎没有以任何方式出现或起作用。这是我尝试过的不同功能;我不确定我是否需要抓住当前的 window 才能绘制它?任何建议将不胜感激。
!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 [=10=]
${If} [=10=] <> 0
MessageBox mb_ok "Checkbox checked."
${EndIf}
FunctionEnd
NSD_Create*
仅在 nsDialog 页面(欢迎和完成 MUI 页面)上受支持,但在 Directory 等内部 NSIS 页面上不受支持。
要在内部页面上创建控件,您必须手动调用 CreateWindowEx
Windows API 函数。其他一些 NSD 辅助宏仍可用于这些控件:
!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[=10=],i2)'
System::Call '*[=10=](i.r2,i.r3,i.r4,i.r5)'
System::Free [=10=]
IntOp - ${CheckHeight}
System::Call 'USER32::SetWindowPos(i$mui.DirectoryPage.Text,i,i,i,i,i,i0x6)'
; Create and initialize the checkbox
IntOp + ; y = TextTop + TextHeight
!insertmacro CreateNativeControl $mui.DirectoryPage ${__NSD_CheckBox_CLASS} "${__NSD_CheckBox_STYLE}" "${__NSD_CheckBox_EXSTYLE}" 0 300 ${CheckHeight} "CheckboxTest"
Pop $Checkbox
SendMessage $mui.DirectoryPage ${WM_GETFONT} 0 0 [=10=] ; Get the dialog font
SendMessage $Checkbox ${WM_SETFONT} [=10=] 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
或者,无需在 运行 时创建控件,您只需使用 Resource Hacker 修改实际页面 (...\NSIS\Contrib\UIs\modern.exe) 并应用新的 UI 文件 MUI_UI
(ChangeUI
)
我希望在 NSIS 中使用 MUI_PAGE_CUSTOMFUNCTION_SHOW
将基本复选框添加到默认目录页面。但是,该复选框似乎没有以任何方式出现或起作用。这是我尝试过的不同功能;我不确定我是否需要抓住当前的 window 才能绘制它?任何建议将不胜感激。
!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 [=10=]
${If} [=10=] <> 0
MessageBox mb_ok "Checkbox checked."
${EndIf}
FunctionEnd
NSD_Create*
仅在 nsDialog 页面(欢迎和完成 MUI 页面)上受支持,但在 Directory 等内部 NSIS 页面上不受支持。
要在内部页面上创建控件,您必须手动调用 CreateWindowEx
Windows API 函数。其他一些 NSD 辅助宏仍可用于这些控件:
!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[=10=],i2)'
System::Call '*[=10=](i.r2,i.r3,i.r4,i.r5)'
System::Free [=10=]
IntOp - ${CheckHeight}
System::Call 'USER32::SetWindowPos(i$mui.DirectoryPage.Text,i,i,i,i,i,i0x6)'
; Create and initialize the checkbox
IntOp + ; y = TextTop + TextHeight
!insertmacro CreateNativeControl $mui.DirectoryPage ${__NSD_CheckBox_CLASS} "${__NSD_CheckBox_STYLE}" "${__NSD_CheckBox_EXSTYLE}" 0 300 ${CheckHeight} "CheckboxTest"
Pop $Checkbox
SendMessage $mui.DirectoryPage ${WM_GETFONT} 0 0 [=10=] ; Get the dialog font
SendMessage $Checkbox ${WM_SETFONT} [=10=] 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
或者,无需在 运行 时创建控件,您只需使用 Resource Hacker 修改实际页面 (...\NSIS\Contrib\UIs\modern.exe) 并应用新的 UI 文件 MUI_UI
(ChangeUI
)