#button #installation #custom-controls #nsis #modern-ui
#кнопка #установка #пользовательские элементы управления #nsis #modern-ui
Вопрос:
я добавил пользовательскую кнопку с помощью Resource Hacker на страницу каталога MUI установщика, теперь я хочу, чтобы при нажатии кнопки текстовое поле по умолчанию, в котором пользователь вводит InstallDir (путь, по которому устанавливается приложение), заполнялось некоторым указанным текстом. пожалуйста, помогите мне с кодом?
Я использую подключаемый модуль ButtonEvent, но я не знаю, какой код написать в обработчике событий. В настоящее время я просто показываю окно сообщения при нажатии кнопки, чтобы убедиться, что событие работает. Пожалуйста, помогите.
!define IDC_BUTTON_SETPATH 1200 (1200 is the ID OF THE BUTTON ADDED from Resource hacker)
;Pages
!insertmacro MUI_PAGE_WELCOME
!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_PAGE_FINISH
;--------------------------------
Function buttonclicked
MessageBox MB_OK|MB_ICONEXCLAMATION "You Clicked Me "
Abort
FunctionEnd
# Occurs on installer UI initialization.
Function myGuiInit
# Create event handler for our parent window button.
GetFunctionAddress $R3 buttonclicked
ButtonEvent::AddEventHandler ${IDC_BUTTON_SETPATH} $R3
FunctionEnd
————————НОВАЯ ОТРЕДАКТИРОВАННАЯ ЧАСТЬ — КОД ДЛЯ ТРЕХ ПОЛЬЗОВАТЕЛЬСКИХ КНОПОК——————-
!include MUI2.nsh
; --------------------------------------------------
!define IDC_BUTTON_CDRIVEPATH 1200
!define IDC_BUTTON_DDRIVEPATH 1201
!define IDC_BUTTON_EDRIVEPATH 1202
; --------------------------------------------------
# The event handler for our parent button is added in MyGUIInit.
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}ContribGraphicsHeaderpksicon.bmp" ; optional
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}ContribGraphicsWizardpksleftimage.bmp" ;
;--------------------------------
XPStyle on
;Interface Settings
!define MUI_ABORTWARNING
;--------------------------------
;Pages
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}DocsModern UIlicensefile.txt"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryShow
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
; --------------------------------------------------
; Languages.
!insertmacro MUI_LANGUAGE English
; --------------------------------------------------
!macro SetDirPageInstallDir text
!if "${MUI_SYSVERSION}" < "2.0"
Push $0
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 0x3FB
SendMessage $0 ${WM_SETTEXT} 0 "STR:${text}"
Pop $0
!else
SendMessage $mui.DirectoryPage.Directory ${WM_SETTEXT} 0 "STR:${text}"
!endif
!macroend
# Called when the CDRIVEPATH button is pressed.
Function CDRIVEPATH
MessageBox MB_OK|MB_ICONEXCLAMATION "The Software will be installed in : C: "
;In buttonclicked handler
!insertmacro SetDirPageInstallDir "C:"
FunctionEnd
;--------------------------------
Function DDRIVEPATH
MessageBox MB_OK|MB_ICONEXCLAMATION "The Software will be installed in : D: "
;In buttonclicked handler
!insertmacro SetDirPageInstallDir "D:"
FunctionEnd
;--------------------------------
Function EDRIVEPATH
MessageBox MB_OK|MB_ICONEXCLAMATION "The Software will be installed in : E: "
;In buttonclicked handler
!insertmacro SetDirPageInstallDir "E:"
FunctionEnd
;--------------------------------
InstallDir $INSTDIR
# Occurs on installer UI initialization.
Function myGuiInit
# Create event handler for our parent window button.
GetFunctionAddress $R0 CDRIVEPATH
ButtonEvent::AddEventHandler ${IDC_BUTTON_CDRIVEPATH} $R0
; GetFunctionAddress $R1 EDRIVEPATH **-----this line causes error**
; ButtonEvent::AddEventHandler ${IDC_BUTTON_DDRIVEPATH} $R1 -----this line causes error
; GetFunctionAddress $R2 EDRIVEPATH **-----this line causes error**
; ButtonEvent::AddEventHandler ${IDC_BUTTON_EDRIVEPATH} $R2 -----this line causes error
FunctionEnd
;------------------------------------------------
# Occurs on Directory page show.
Function DirectoryShow
# Create event handler for our Directory page button. /NOTIFY makes
# the button move to the next page when clicked.
ButtonEvent::AddEventHandler ${IDC_BUTTON_CDRIVEPATH}
ButtonEvent::AddEventHandler ${IDC_BUTTON_DDRIVEPATH}
ButtonEvent::AddEventHandler ${IDC_BUTTON_EDRIVEPATH}
# Disable next button.
GetDlgItem $R0 $HWNDPARENT 1
EnableWindow $R0 0
FunctionEnd
; --------------------------------------------------
;General
;Name and file
Name NEW_FILL_TEXTBOX_BUTTONCLICK
OutFile NEW_FILL_TEXTBOX_BUTTONCLICK.exe
Section
DetailPrint "SUCCESSFULLY INSTALLED"
SectionEnd
Ответ №1:
Вы не сказали, какую версию MUI вы используете, этот макрос должен обрабатывать обе…
!macro SetDirPageInstallDir text
!if "${MUI_SYSVERSION}" < "2.0"
Push $0
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 0x3FB
SendMessage $0 ${WM_SETTEXT} 0 "STR:${text}"
Pop $0
!else
SendMessage $mui.DirectoryPage.Directory ${WM_SETTEXT} 0 "STR:${text}"
!endif
!macroend
;In buttonclicked handler
!insertmacro SetDirPageInstallDir "$programfilesHello World"
Комментарии:
1. большое спасибо, сэр, но когда я использую 2 или 3 пользовательские кнопки, то при запуске установщика он автоматически завершается, когда должна появиться страница диалога, на которой существуют пользовательские кнопки. я опубликовал новый код в отредактированной части моего поста
2. @sqlchild: Я никогда не использовал этот плагин, но добавление кнопок как в myGuiInit, так и в DirectoryShow мне кажется неправильным. Для получения дополнительной информации вам следует спросить автора плагина на форуме nsis или на странице обсуждения плагина в wiki…
3. ХОРОШО, сэр, так это вопрос плагина ButtonEvent? ваш код успешно работает, когда у меня есть только одна ПОЛЬЗОВАТЕЛЬСКАЯ КНОПКА в моем диалоговом окне, и я использую плагин ButtonEvent, тогда он работает нормально.
4. итак, эта проблема связана с плагином, поэтому я попрошу автора рассказать мне код, чтобы добавить buttonevents для НЕСКОЛЬКИХ КНОПОК? не так ли?