Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
kotkovets
05-02-2013, 19:53
Т.е. нужна, например, проверка - что в поле с ID указано число, а не текст.
Через логически функции это сделать можно, но как запретить переход на след страницу или возврат к предыдущей, пока не поправишь? »
В функции при закрытии странички проверяем, чтобы строка пустая не была, иначе прерывание.
Дорабатываем контрол - только на ввод цифр и не более двух символов..
!include "MUI2.nsh"
OutFile "winreview.exe"
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
var Dialog
var clientDistrictId
Function fnCustomInit
!insertmacro MUI_HEADER_TEXT "Параметры сервера" "Укажите данные для данного сервера"
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateLabel} 0 40u 120u 13u "Введите ID (1-99):"
pop $0
${NSD_CreateNumber} 120u 40u 20u 13u "99"
Pop $clientDistrictId
${NSD_SetTextLimit} $clientDistrictId 2
nsDialogs::Show
FunctionEnd
Function fnCustomDestroy
${NSD_GetText} $clientDistrictId $R1
Strlen $R2 $R1
StrCmp $R2 0 0 +3
MessageBox MB_OK "Введите ID !" IDOK
Abort
FunctionEnd
Section
SectionEnd
Подскажите. В хедере кода прописываю вот эту строку:
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
Но после компиляции никаких изменений нету - в качестве изображения шапки инсталлятора показывается иконка файла инсталлятора, которая прописана в коде:
!define MUI_ICON "D:\Инсталлятор\images\install.ico"
Файл ресурсов использую UIs\modern.exe. В нем положение картинки шапки немного подредактировал, хотя и по стандартному такая же проблема была.
Использую EclipseNSIS, MUI2
Помогите пожалуйста поменять картинку шапки инсталлятора! Заранее спасибо!
Происходит такая странность : хотя по умолчанию и отмечена RadioButton1, но при клике на Button1, событие её отметки оказывается не зафиксировано.
Если же разок кликнуть по уже отмеченной RadioButton1 - сразу всё ОК. И при переключении на RadioButton2 - всё ОК.
В чём причина отсутствия реакции на дефолтовую отметку ?
!include MUI2.nsh
OutFile "RBSelect_test.exe"
Page custom Page
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Var dlg
Var RadioButton1
Var RadioButton2
Var Check1
Var Check2
Var Button1
Var /Global Event
Function Page
nsDialogs::Create 1044
Pop $dlg
${NSD_CreateRadioButton} 31u 73u 60u 14u "RadioButton1"
Pop $RadioButton1
${NSD_SetState} $RadioButton1 1
${NSD_OnClick} $RadioButton1 fnRadioButton1
${NSD_CreateRadioButton} 31u 96u 60u 14u "RadioButton2"
Pop $RadioButton2
${NSD_OnClick} $RadioButton2 fnRadioButton2
${NSD_AddStyle} $RadioButton1 ${WS_GROUP}
${NSD_CreateButton} 31u 161u 92u 13u "Button"
Pop $Button1
${NSD_OnClick} $Button1 fnButton1
nsDialogs::Show
FunctionEnd
Function fnRadioButton1
${NSD_SetState} $RadioButton1 1
${NSD_GetState} $RadioButton1 $Check1
${If} $Check1 == 1
StrCpy $Event "Отмечен RadioButton1"
${EndIf}
FunctionEnd
Function fnRadioButton2
${NSD_GetState} $RadioButton2 $Check2
${If} $Check2 == 1
StrCpy $Event "Отмечен RadioButton2"
${EndIf}
FunctionEnd
Function fnButton1
Pop $Button1
MessageBox MB_OK "$Event"
SetAutoClose true
FunctionEnd
Section
SectionEnd
Begin2Fly
06-02-2013, 13:43
MKN, потому что функция fnRadioButton[1/2] со всеми вытекающими отрабатывает только после клика по RadioButton[1/2], которого после запуска инсталлятора ещё не было.
Простая команда Call fnRadioButton1 перед nsDialogs::Show решит проблему.
отрабатывает только после клика по RadioButton[1/2] »
Действительно, не учёл... Благодарю за замечание. Тогда лучше вызывать fnRadioButton1/2 из fnButton1 - в зависимости от отметки RadioButton1/2.
(Потому, как приведённый пример, частный случай для двух кнопок. Если же их не 2 , а 32...)
Доброго дня, методом проб и ошибок, мучая предоставленные ранее примеры и справочник из шапки, понял что в первый раз и спрашивал чутка нето и видел процес по другому. В моей последней версии получилось вот так
!define PRODUCT_NAME "Notes"
!define PRODUCT_VERSION "v3"
!define pkgdir "C:\1\"
!include "MUI2.nsh"
!include "TextFunc.nsh"
SetCompress off
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\7.ico"
!define TVM_SETBKCOLOR 0x111D
!define TVM_SETTEXTCOLOR 0x111E
!define MUI_COMPONENTSPAGE_NODESC
!define MUI_COMPONENTSPAGE_TEXT_TOP "Текст"
!define MUI_COMPONENTSPAGE_TEXT_INSTTYPE "Выберите установку:"
!define MUI_COMPONENTSPAGE_TEXT_COMPLIST "Выберите настройки закладок ${PRODUCT_NAME}"
!define MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Contrib\Graphics\Checks\colorful.bmp"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
InstType "Полная установка"
Name "${PRODUCT_NAME}"
Caption "Установка ${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME} ${PRODUCT_VERSION}.exe"
Function CompShowProc
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1032
SendMessage $0 ${TVM_SETBKCOLOR} 0 0xFFF0F0
SendMessage $0 ${TVM_SETTEXTCOLOR} 0 0x2828FF
CreateFont $1 "Comic Sans Ms" 9 0
SendMessage $0 ${WM_SETFONT} $1 0
FunctionEnd
SubSection /e "Клиент ${PRODUCT_NAME}"
Section "Настройка клиента и закладок" test
SectionIn 1
SectionIn RO
SetOutPath "D:\NotesTemp"
File /r "${pkgdir}\Notes\"
ExecWait "msiexec.exe /i $\"******"
SetOutPath "D:\NotesTemp"
File "${pkgdir}\addfile\add_file_ini.txt"
${FileJoin} "D:\Notes\notes.ini" "D:\NotesTemp\add_notes_ini.txt" ""
SetOutPath "D:\Notes\"
File "${pkgdir}\addfile\setup.txt"
SetOutPath "D:\Notes\Data\"
File /r "${pkgdir}\addfile\bookmark_mail\"
SetOutPath "D:\NotesTemp"
File "${pkgdir}\addfile\INSTALmail.BAT"
ExecWait "D:\NotesTemp\INSTALmail.BAT"
SectionEnd
Section /o "Настройка закладок 2" test1
SectionIn 1
SetOutPath "D:\Notes\Data\"
File /r "${pkgdir}\addfile\bookmark_sed\"
SectionEnd\
SubSectionEnd
Section #Удаление временных файлов
RMDir /r "D:\NotesTemp"
SectionEnd
Основываясь на примере из справки "Страница выбора компонентов установки" начал его пилить под себя и практически все задуманное получилось.
От одного батника избавился полностью, там было добавление строк в .txt и копирование фалов.
А вот у второго осталась одна последняя строчка к которой незнаю как подступиться.
if %userdomain% == ACME echo UserName=%username% >> D:\Notes\setup.txt
Не подскажите как можно реализовать прозвон домена и если совпадает, то пульнуть имя юзера в .txt ??
И вопрос второй косметический, в окне компонентов есть пунк который показывает требуемое место на диске, можно ли ему как то присвоить свое статичное значение или выключить вообще?? (Это не кретично, но не красиво выходит, инсталер не учитывает работу .msi который отрабатывает в процесе)
kotkovets
06-02-2013, 18:50
Помогите пожалуйста поменять картинку шапки инсталлятора! Заранее спасибо! »
чтобы отображалась картинка, нужно сначала прописать:
!define MUI_HEADERIMAGE
а затем прописать:
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
читайте в справочнике: Оформление->Интерфейс Модерн->» Заголовок инсталлятора
Не подскажите как можно реализовать прозвон домена и если совпадает, то пульнуть имя юзера в .txt ? »
самое простое решение должно сработать так nsExec::Exec `"$WINDIR\System32\cmd.exe" /C if %userdomain% == ACME echo UserName=%username% >> D:\Notes\setup.txt`
Можно конечно и все реализовать без cmd.
Function Test
Var /GLOBAL log
ExpandEnvStrings $1 %userdomain%
ExpandEnvStrings $2 %username%
StrCmp $1 ACME 0 +4
FileOpen $log "D:\Notes\setup.txt" w
FileWrite $log "$2"
FileClose $log
FunctionEnd
И вопрос второй косметический, в окне компонентов есть пунк который показывает требуемое место на диске, можно ли ему как то присвоить свое статичное значение или выключить вообще?? (Это не кретично, но не красиво выходит, инсталер не учитывает работу .msi который отрабатывает в процесе) »
Для секций есть такая команда AddSize вызывается внутри секции добавляет для секции дополнительно необходимое пространство в кб. Подробнее можно прочитать в оригинальной справке. Например AddSize 1024.
profcom Спасибо, буду пробовать дальше )
Фоновое изображение на стандартных страницах (на всех или по выбору)
!include MUI.nsh
!include WinMessages.nsh
;size 497x314
!define BITMAP_FILE bg.bmp
Name "Background Bitmap"
OutFile "bgbitmap.exe"
InstallDir "$TEMP"
ShowInstDetails show
!define MUI_COMPONENTSPAGE_NODESC
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit
!define LR_LOADFROMFILE 0x0010
!define LR_CREATEDIBSECTION 0x2000
!define IMAGE_BITMAP 0
!define SS_BITMAP 0x0000000E
!define WS_CHILD 0x40000000
!define WS_VISIBLE 0x10000000
!define HWND_TOP 0
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002
!define IDC_BITMAP 1500
!define stRECT "(i, i, i, i) i"
Var hBitmap
!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePageShow
!insertmacro MUI_PAGE_WELCOME
;!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePageShow
;!insertmacro MUI_PAGE_LICENSE bgbitmap.nsi
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryPageShow
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ComponentsPageShow
!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesPageShow
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPageShow
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English
; Destroy a window.
!macro DestroyWindow HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
System::Call `user32::DestroyWindow(i R0)`
!macroend
; Give window transparent background.
!macro SetTransparent HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
SetCtlColors $R0 0xFFFFFF transparent
!macroend
; Refresh window.
!macro RefreshWindow HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
ShowWindow $R0 ${SW_HIDE}
ShowWindow $R0 ${SW_SHOW}
!macroend
Function MyGUIInit
InitPluginsDir
ReserveFile `${BITMAP_FILE}`
File `/ONAME=$PLUGINSDIR\bg.bmp` `${BITMAP_FILE}`
; Получение параметров родительского окна
System::Call `*${stRECT} .R0`
System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)`
System::Call `*$R0${stRECT} (, , .R1, .R2)`
System::Free $R0
; Создание нового окна и помещение в него изображения
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 0, i 0, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R1`
System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`
System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\bg.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $hBitmap
SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap
; Установка прозрачности фона
!insertmacro SetTransparent $HWNDPARENT 3
!insertmacro SetTransparent $HWNDPARENT 1
!insertmacro SetTransparent $HWNDPARENT 2
!insertmacro SetTransparent $HWNDPARENT 1034
!insertmacro SetTransparent $HWNDPARENT 1037
!insertmacro SetTransparent $HWNDPARENT 1038
;Удаление не нужных контролов (элементов управления)
!insertmacro DestroyWindow $HWNDPARENT 1256
!insertmacro DestroyWindow $HWNDPARENT 1028
!insertmacro DestroyWindow $HWNDPARENT 1039
FunctionEnd
;Обновление контролов родительского окна. Необходимо для некоторых элементов управления,
;если они имеют прозрачный фон.
Function RefreshParentControls
!insertmacro RefreshWindow $HWNDPARENT 1037
!insertmacro RefreshWindow $HWNDPARENT 1038
FunctionEnd
Function WelcomePageShow
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1200
!insertmacro SetTransparent $MUI_HWND 1201
!insertmacro SetTransparent $MUI_HWND 1202
FunctionEnd
/*; For license page.
Function LicensePageShow
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1040
!insertmacro SetTransparent $MUI_HWND 1000
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1034
!insertmacro SetTransparent $MUI_HWND 1035
Call RefreshParentControls
FunctionEnd*/
Function DirectoryPageShow
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1019
!insertmacro SetTransparent $MUI_HWND 1001
!insertmacro SetTransparent $MUI_HWND 1024
!insertmacro SetTransparent $MUI_HWND 1008
!insertmacro SetTransparent $MUI_HWND 1023
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1020
; Remove group box text. $R0 still contains HWND of 1020
SendMessage $R0 ${WM_SETTEXT} 0 STR:
; Refresh controls.
Call RefreshParentControls
FunctionEnd
Function ComponentsPageShow
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1017
!insertmacro SetTransparent $MUI_HWND 1022
!insertmacro SetTransparent $MUI_HWND 1021
!insertmacro SetTransparent $MUI_HWND 1023
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1032
Call RefreshParentControls
FunctionEnd
Function InstFilesPageShow
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1027
!insertmacro SetTransparent $MUI_HWND 1004
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1016
Call RefreshParentControls
FunctionEnd
Function FinishPageShow
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1200
!insertmacro SetTransparent $MUI_HWND 1201
!insertmacro SetTransparent $MUI_HWND 1202
!insertmacro SetTransparent $MUI_HWND 1203
!insertmacro SetTransparent $MUI_HWND 1204
!insertmacro SetTransparent $MUI_HWND 1205
!insertmacro SetTransparent $MUI_HWND 1206
FunctionEnd
; Free loaded resources. Destroy the bitmap.
Function .onGUIEnd
System::Call `gdi32::DeleteObject(i s)` $hBitmap
FunctionEnd
Section "Section1"
SectionEnd
Картинку фона ессно используйте свою - bg.bmp размером 497x314
Lex_from_Belarus
07-02-2013, 23:22
Так ещё одна загвоздка с radiobutton
Имеется структура выбора компонентов:
-Группа секций 1
--Секция 11 ID_11
--Секция 12 ID_12
--Секция 13 ID_13
-Группа секций 2
--Секция 21 ID_21
--Секция 22 ID_22
--Секция 23 ID_23
используя код из справочника, всё хорошо выбирает.
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro EndRadioButtons
НО хотелось бы чтобы по нажатию на чекбокс "Группа секций 1", происходило убирание голчек с секций 11, 12, 13, т.е. со всей группы.
Подскажите что добавить чтобы можно было управлять группой.
Lex_from_Belarus, воспользуйтесь поиском по фразе .onSelChange, мы в предыдущей теме что только не делали с секциями...
Вам нужно создать функцию .onSelChange, в неё прописать проверку статусов секций из своей группы (команда SectionGetFlags), и, если там будет статус "отмечена" (команда StrCmp) (одна или 3, как вам нужно), то тогда применяете команду SectionSetFlags
Lex_from_Belarus
08-02-2013, 16:22
Lex_from_Belarus, воспользуйтесь поиском по фразе .onSelChange, мы в предыдущей теме что только не делали с секциями...
Вам нужно создать функцию .onSelChange, в неё прописать проверку статусов секций из своей группы (команда SectionGetFlags), и, если там будет статус "отмечена" (команда StrCmp) (одна или 3, как вам нужно), то тогда применяете команду SectionSetFlags »
нда, посидев и почитав, понял, что замутить нереально с такой реализацией
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro EndRadioButtons
можно только с кривой реализацией, когда сначала с секции убирается выделение а потом присваивается. а этот нормальный метод переключения по одному нажатию не прокатит, а жаль.
т.е. реализовать выбор одного компонента одним нажатием исключающие выбор двух других компонентов не получится, а получится только выбор двойным нажатием...
Lex_from_Belarus,
Сделай свою комбинацию на кастомной странице (с помощью nsDialogs). Там любую комбинацию можно реализовать.
Lex_from_Belarus
08-02-2013, 17:08
MKN, да я если честно вообще не понимаю, как за столько лет существования nsis с отсутствующим в нём radiobutton не нарисовали кастомной страницы с дизайном стандартной. а сам не хочу писать потому как знают что кривая будет страница в плане сходства с оригиналом, а сколько надо сделать чтобы её реализовать и заставить работать. жуть.
Кстати может у кого есть нарисованный кастом под компоненты?
Lex_from_Belarus,
Примеров уже было много. Просмотри 1 часть темы, наверняка найдёшь подходящее, останется только подкорректировать под свои нужды.
habib2302
08-02-2013, 20:17
люди.подскажите как сделать вот такую страницу компонентов
http://i51.fastpic.ru/big/2013/0208/1f/67fd2e3cd5b54d0f53f6ab2c87aa311f.png (http://i51.fastpic.ru/big/2013/0208/ab/cb0b63cba2f50abb7e0b8c5bbc41e4ab.png)
люди.подскажите как сделать вот такую страницу компонентов »
Справку по nsDialogs почитать и сделать.
andryz80
09-02-2013, 02:42
в секции деинсталляции проблема.
все удаляется без проблем кроме того, что в меню пуск
Section Uninstall
SetOutPath "$PROGRAMFILES"
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"
RMDir /r "$INSTDIR\Makros"
Delete "$INSTDIR\titel.bmp"
Delete "$INSTDIR\Sprint-Layout60.chm"
Delete "$INSTDIR\LAYOUT60.INI"
Delete "$INSTDIR\Layout60.exe"
Delete "$SMPROGRAMS\Sprint Layout 6\Uninstall.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Website.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Help.lnk"
Delete "$DESKTOP\Sprint Layout.lnk"
Delete "$SMPROGRAMS\Sprint Layout 6\Sprint Layout.lnk"
RMDir /r "$SMPROGRAMS\Sprint Layout 6" RMDir /r "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
SetAutoClose true
SectionEnd
windows 7 64 бита в чем моя ошибка.
и еще дайте пример как зарегистрировать расширение файла (ассоциацию)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.