Войти

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

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

Awral
06-02-2013, 13:10
Подскажите. В хедере кода прописываю вот эту строку:
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\nsis.bmp"
Но после компиляции никаких изменений нету - в качестве изображения шапки инсталлятора показывается иконка файла инсталлятора, которая прописана в коде:
!define MUI_ICON "D:\Инсталлятор\images\install.ico"

Файл ресурсов использую UIs\modern.exe. В нем положение картинки шапки немного подредактировал, хотя и по стандартному такая же проблема была.

Использую EclipseNSIS, MUI2

Помогите пожалуйста поменять картинку шапки инсталлятора! Заранее спасибо!

MKN
06-02-2013, 13:17
Происходит такая странность : хотя по умолчанию и отмечена 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 решит проблему.

MKN
06-02-2013, 16:05
отрабатывает только после клика по RadioButton[1/2] »
Действительно, не учёл... Благодарю за замечание. Тогда лучше вызывать fnRadioButton1/2 из fnButton1 - в зависимости от отметки RadioButton1/2.
(Потому, как приведённый пример, частный случай для двух кнопок. Если же их не 2 , а 32...)

ASiRU
06-02-2013, 18:45
Доброго дня, методом проб и ошибок, мучая предоставленные ранее примеры и справочник из шапки, понял что в первый раз и спрашивал чутка нето и видел процес по другому. В моей последней версии получилось вот так

!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"
читайте в справочнике: Оформление->Интерфейс Модерн->» Заголовок инсталлятора

profcom
06-02-2013, 19:40
Не подскажите как можно реализовать прозвон домена и если совпадает, то пульнуть имя юзера в .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

profcom
06-02-2013, 20:07
И вопрос второй косметический, в окне компонентов есть пунк который показывает требуемое место на диске, можно ли ему как то присвоить свое статичное значение или выключить вообще?? (Это не кретично, но не красиво выходит, инсталер не учитывает работу .msi который отрабатывает в процесе) »
Для секций есть такая команда AddSize вызывается внутри секции добавляет для секции дополнительно необходимое пространство в кб. Подробнее можно прочитать в оригинальной справке. Например AddSize 1024.

ASiRU
07-02-2013, 10:24
profcom Спасибо, буду пробовать дальше )

MKN
07-02-2013, 17:05
Фоновое изображение на стандартных страницах (на всех или по выбору)

!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, т.е. со всей группы.
Подскажите что добавить чтобы можно было управлять группой.

K.A.V.
08-02-2013, 05:25
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

можно только с кривой реализацией, когда сначала с секции убирается выделение а потом присваивается. а этот нормальный метод переключения по одному нажатию не прокатит, а жаль.

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

MKN
08-02-2013, 16:40
Lex_from_Belarus,
Сделай свою комбинацию на кастомной странице (с помощью nsDialogs). Там любую комбинацию можно реализовать.

Lex_from_Belarus
08-02-2013, 17:08
MKN, да я если честно вообще не понимаю, как за столько лет существования nsis с отсутствующим в нём radiobutton не нарисовали кастомной страницы с дизайном стандартной. а сам не хочу писать потому как знают что кривая будет страница в плане сходства с оригиналом, а сколько надо сделать чтобы её реализовать и заставить работать. жуть.

Кстати может у кого есть нарисованный кастом под компоненты?

MKN
08-02-2013, 18:10
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)

profcom
08-02-2013, 22:07
люди.подскажите как сделать вот такую страницу компонентов »
Справку по 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