заполните текстовое поле каталога при нажатии кнопки в установщике MUI NSI, используя подключаемый модуль ButtonEvent

#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 для НЕСКОЛЬКИХ КНОПОК? не так ли?