Цитата tony1990:
Похоже что определение видимости/невидимости секций работает только в .onInit »
|
Если пункт в элементе уже существует - его нельзя скрыть, можно только удалить
Если хотите именно скрывать пункты - вам нужно писать свою кастомную страничку, на ней уже будете обрабатывать, какой пункт выбрал пользователь (x32/x64) и в зависимости от выбора заполнять элемент нужными пунктами, очищая перед заполнением, всё это придётся прописывать вручную.
Набрасывать такой код не буду по одной простой причине - не знаю, какой вы хотите видеть кастомную страничку, такой же, как и дефолтная с выпадающим списком - или с выбором типа установки по принципу радиобаттонов и вообще, с помощью чего собираетесь делать кастомную страничку, IO или nsDialogs
Если не браться за кастомную страничку и попытаться реализовать это, то можно сделать с помощью костылей, т.е. код будет не очень красивый и удобный, вот пример этого ужасного кода (не пишите такой код никогда
):
Код:
!define PRODUCT_NAME "Моя программа"
!include "MUI.nsh"
page custom ClickNext ; автоматически жмём кнопку "Далее", чтобы список элементов перестроился автоматически в зависимости от выбора - нам нужно перезагрузить страничку с компонентами, нажав "Назад" и потом "Далее"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW hideBackButton ; Скрываем кнопку "Назад" от пользователя
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
Name "${PRODUCT_NAME}"
OutFile "setup.exe"
InstallDir "$TEMP"
ShowInstDetails show
InstType /NOCUSTOM
InstType x32
InstType x64
Section /o "Эта секция для 32-bit ОС" SEC_32BIT
SectionIn 1
SectionEnd
Section /o "Эта секция для 64-bit ОС" SEC_64BIT
SectionIn 2
SectionEnd
Function ClickNext ; Жмём кнопку Далее
GetDlgItem $0 $HWNDPARENT 1
SendMessage $0 ${BM_CLICK} 0 0
FunctionEnd
Function hideBackButton ; Скрываем кнопку Назад
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0
FunctionEnd
Function .onSelChange
GetCurInstType $R0 ; Получаем статус выбранного типа установки
${If} $R0 == "0" ; Если первый (x32) - присваиваем текст секциям для x32 системы и скрываем секции с x64 системой
SectionSetText ${SEC_32BIT} "SEC_32BIT"
SectionSetText ${SEC_64BIT} ""
${ElseIf} $R0 == "1"
SectionSetText ${SEC_32BIT} ""
SectionSetText ${SEC_64BIT} "SEC_64BIT"
${EndIf}
GetDlgItem $0 $HWNDPARENT 3
SendMessage $0 ${BM_CLICK} 0 0
FunctionEnd
Function .onInit
Var /Global IsWow64Process
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process ; 0 = 32-bit ОС, 1 = 64-bit ОС
${If} $IsWow64Process == "0" ; первоначальный выбор типа установки в зависимости от системы пользователя
SetCurInstType 0
SectionSetText ${SEC_32BIT} "SEC_32BIT"
SectionSetText ${SEC_64BIT} ""
${Else}
SetCurInstType 1
SectionSetText ${SEC_32BIT} ""
SectionSetText ${SEC_64BIT} "SEC_64BIT"
${EndIf}
FunctionEnd
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_64BIT} ""
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_32BIT} ""
!insertmacro MUI_FUNCTION_DESCRIPTION_END
И при всей своей конструкции - он будет работать только при условии, что до странички компонентов у вас ничего не отображается...
С кастомной страничкой это будет выглядеть красивее и удобнее, да и правильнее