Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Можно ли как-то добавить свой текст на странице прогресса установки (под прогресс баром)? »
Можно так :
OutFile "PAGE_INSTFILES_TXT_Test.exe"
InstallDir "$TEMP"
!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
; рамка вокруг области текста (если надо)
!define WS_BORDER 0x00800000
Function ShowTxt
; наш текст
StrCpy $R7 "Текст Текст Текст Текст Текст Текст Текст Текст"
FindWindow $R0 "#32770" "" $HWNDPARENT
; создаём окно области текста
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R7",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i60,i$R0,i222,i0,i0) i.R2'
; цвет текста & цвет фона области текста
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
; чтобы шрифт был, как и на странице (ессно можно назначить свой)
SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
FunctionEnd
Section
Sleep 1000
SectionEnd
Варианты флагов для CreateWindowEx и координаты области текста - по вкусу.
MKN, благодарю за подробный пример! Всё сработало!
Очень полезная возможность.
А можно ли туда ещё небольшую картинку приделать? Что-то вроде баннера.
А можно ли туда ещё небольшую картинку приделать? »
Добавь в Function ShowTxt :
!define HWND_TOP 0
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002
!define IDC_BITMAP 1500
; например поместим картинку mypict.bmp ( размер выбран 58x80 - для "вписывания" в уже имеющееся на странице, "хозяйство" )
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 220, i 220, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R2'
System::Call 'user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 00, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})'
System::Call `user32::LoadImage(i 0, t "mypict.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $R8
SendMessage $R2 ${STM_SETIMAGE} ${IMAGE_BITMAP} $R8
; этот код обычно в Function .onGUIEnd )
System::Call 'gdi32:DeleteObject(i $R8)'
Ессно надо позаботиться о местонахождении mypict.bmp (обычно в $PLUGINSDIR через Function .onInit )
MKN, спасибо, выручаешь. И ещё один вопрос по этой теме.
Команда:
StrCpy $R7 "Текст Текст Текст Текст Текст Текст Текст Текст"
Как в ней делать перенос строки?
$\n не срабатывает(
+если можно, то подскажи, пожалуйста, как добавить ещё 2 строки с текстом над текстом, который в рамке? То есть нужен ещё просто текст над рамкой.
Ну и ещё один момент - текст почему-то редактируемый получается в рамке. Думал это из-за значения EDIT в команде System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R7",\
Попробовал STATIC - текст вообще пропал) Короче у меня руки походу растут не откуда надо)
Пока сам поковырял и погуглил по теме. Вроде получилось то что задумал.
http://i68.fastpic.ru/big/2014/1218/b4/fdfa7c3208595b233d3dd173effe50b4.jpg
Могу и код выложить... Но просто он такой ужасный, что при его виде у профи по НСИСУ станет плохо с сердцем. Я даже не знаю как он скомпилировался.
И уточню вопрос в тексте. Хочу, чтоб текст можно было скопировать в буфер, но при этом чтоб нельзя его было изменять в области окна.
Begin2Fly
18-12-2014, 01:02
Serg866, добавьте эту строку к похожим:
SendMessage $R2 ${EM_SETREADONLY} 1 0
Begin2Fly, нее, что-то не срабатывает команда
Begin2Fly
18-12-2014, 01:12
Serg866, я добавлял к коду MKN, возможно, вы что-то переделывали.
OutFile "PAGE_INSTFILES_TXT_Test.exe"
InstallDir "$TEMP"
!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
; рамка вокруг области текста
!define WS_BORDER 0x00800000
Function ShowTxt
; наш текст
StrCpy $R9 "Текст Текст Текст Текст $\r$\n$\r$\n Текст Текст Текст Текст"
FindWindow $R0 "#32770" "" $HWNDPARENT
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R9",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i60,i$R0,i222,i0,i0) i.R2'
; цвет текста & цвет фона
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
SendMessage $R2 ${EM_SETREADONLY} 1 0
FunctionEnd
Section
Sleep 1000
SectionEnd
Begin2Fly , да я наворотил что-то там... Отправил Вам в личку код.
Надо его облагородить.
текст почему-то редактируемый получается в рамке. »
Потому что гладиолус :) флаг EDIT. Как уже было сказано - играй флагами по вкусу.
Как ты уже правильно хотел сделать, поменяй EDIT на STATIC. И, раз не нужно редактирование, удали не нужные флаги. Т.е. ,будет :
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R7",i ${WS_CHILD}|${WS_VISIBLE},\
i5,i80,i445,i60,i$R0,i222,i0,i0) i.R2'
WS_CHILD - Дочернее окно.
WS_VISIBLE - Создается окно, которое сразу становится видимым.
По умолчанию окна создаются невидимыми, и для их отображения требуется вызывать функцию ShowWindow .
можно ещё короче :
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R7",i${DEFAULT_STYLES},\
i5,i80,i445,i60,i$R0,i222,i0,i0) i.R2'
Если нужна прокрутка, оставь ${WS_VSCROLL} (для случая, когда весь текст не вмещается в область созданного окна)
(Если не хочется видеть полосу прокрутки, а текста много - расширь область окна, смести прогресс бар повыше и сделай уже его полоску. Вариантов много.)
ps про всё это уже говорилось в теме
Serg866,
Вот вариант для PAGE_INSTFILES с собственным окном для текста, с текстом-заголовком над этим окном и картинкой :
OutFile "PAGE_INSTFILES_TXT_Pict_Test.exe"
Name "PAGE_INSTFILES_TXT_Pict"
InstallDir "$TEMP"
!include MUI2.nsh
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowTxt
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails nevershow
!define WS_BORDER 0x00800000
!define HWND_TOP 0
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002
!define IDC_BITMAP 1500
Var hBitmap
Function .onInit
InitPluginsDir
File /oname=$PLUGINSDIR\vinni.bmp "vinni.bmp"
FunctionEnd
Function ShowTxt
StrCpy $R9 "Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне$\r$\n\
Текст в окне Текст в окне"
FindWindow $R0 "#32770" "" $HWNDPARENT
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R9",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i5,i100,i445,i100,i$R0,i222,i0,i0) i.R1'
SetCtlColors $R1 `0x0000FF` `0x99FFFF`
SendMessage $R0 ${WM_GETFONT} 0 0 $R9
SendMessage $R1 ${WM_SETFONT} $R9 0
SendMessage $R1 ${EM_SETREADONLY} 1 0
StrCpy $R8 "Текст над окном"
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R8",i ${WS_CHILD}|${WS_VISIBLE},i15,i75,i445,i20,i $R0,i122,i0,i0) i.R5'
SendMessage $R0 ${WM_GETFONT} 0 0 $R8
SendMessage $R5 ${WM_SETFONT} $R8 0
; помещаем на страницу картинку "vinni.bmp" (размеров 58x80)
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i370, i110, i58, i80, i $R0, 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\vinni.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $hBitmap
SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $hBitmap
FunctionEnd
; Free loaded resources.
Function .onGUIEnd
; Destroy the bitmap.
System::Call `gdi32::DeleteObject(i s)` $hBitmap
FunctionEnd
Section
Sleep 500
SectionEnd
http://s017.radikal.ru/i421/1412/c4/4c0ca23fecd1.jpg
Painkiller
19-12-2014, 14:18
Народ , в чем может быть проблема кода :
${If} ${KeyExists} "${HKLM}\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}"
DetailPrint '[Присутствует] KB2881071 '
${Else}
DetailPrint '[не Установлено] KB2881071'
${EndIf}
Ключ не существует , а код говорит обратное =((
Ось 7 x64
Painkiller,
Что это у тебя за синтаксис ?...
попробуй такие варианты :
ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\App" ""
${If} ${Errors}
# ключ не существует
${EndIf}
или
ClearErrors
EnumRegKey $ 0 HKCR "SOFTWARE\App" 0
IfErrors 0 keyexist
# ключ не существует
keyexist:
Painkiller
19-12-2014, 17:51
Что это у тебя за синтаксис ?... »
Взял из справочника , использую плагин RegistryFunc
попробуй такие варианты : »
MKN, попробовал твой пример, теперь ключ не существует, не зависимо от того, есть он или нету =((
ClearErrors
ReadRegStr $0 HKLM "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{8BEEA2FC-D416-428A-B52A-A3ED45921151}" ""
${If} ${Errors}
DetailPrint '[не Установлено] KB2553140'
${Else}
DetailPrint '[Установлено] KB2553140'
${EndIf}
Нашёл рабочее решение :
!include "Registry.nsh"
.....
; ----- KB2881071 -----------
${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" $9
StrCmp $9 0 0 +2
DetailPrint '[Присутствует] KB2881071'
StrCmp $9 -1 0 +2
DetailPrint '[нету] KB2881071'
SectionEnd
Но мне нужно засунь определенные действия в каждый из случаев . ${If} ${Else}${EndIf} не прокатывают =((
Painkiller,
Конечно не работает, ведь ReadRegStr читает не сам ключ, а его значение (а оно у тебя пусто, или по факту какое то есть ? Если есть, то вполне можно "привязаться" к нему)
Если значения нет, используй EnumRegKey, с ним работает :
ClearErrors
EnumRegKey $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" 0
IfErrors 0 keyexist
MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации."
keyexist:
MessageBox MB_OK "Дальнейший код"
Но мне нужно засунь определенные действия в каждый из случаев . ${If} ${Else}${EndIf} не прокатывают =(( »
${registry::KeyExists} "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}" $9
${If} $9 == 0
MessageBox MB_OK|MB_ICONINFORMATION "[Присутствует] KB2881071"
${Else}
MessageBox MB_OK|MB_ICONINFORMATION "нету KB2881071"
${EndIf}
Painkiller
20-12-2014, 17:04
Радовался что все получилось , да вот зря=(( Не все ключ правильно определяет (((
Не все ключ правильно определяет »
В смысле ? Нужно определить не просто наличие ключа, а конкретно его название ?
Тогда можно так :
${Do}
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0 # перечисляются все разделы в ветке Uninstall
IntOp $0 $0 + 1
StrCpy $2 $1
${If} $2 == "{90140000-0012-0000-0000-0000000FF1CE}_Office14.STANDARD_{0BC570F0-7352-4A3A-B2A2-CA56ADA7375F}"
ClearErrors
MessageBox MB_OK "$1"
${EndIf}
${LoopUntil} $1 == ""
Painkiller
23-12-2014, 14:45
MKN, мне нужен код чтобы при наличии ключа выполнял какие-то действия и при его отсутствии тоже выполнял определенные действия ?? Как изменить код , который вы мне оставили для моих нужд ?
Painkiller, мне нужен код чтобы при наличии ключа выполнял какие-то действия и при его отсутствии тоже выполнял определенные действия ? »
Так пример же дан. :
MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации."
keyexist:
MessageBox MB_OK "Дальнейший код"
Вместо "MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации." - пишешь свой код , когда ключа нет.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC