PDA

Показать полную графическую версию : .: 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

Painkiller
23-12-2014, 15:17
Вместо "MessageBox MB_OK "Ключа нет ! Здесь же код для этой ситуации." - пишешь свой код , когда ключа нет. »
А где писать когда ключ есть ?

Ладно, решу проблему на delphi

MKN
23-12-2014, 15:30
А где писать когда ключ есть ? »
Так очевидно же - после метки keyexist: , т.е. вместо "MessageBox MB_OK "Дальнейший код"
Т.е. , ещё раз - нет ключа: весь твой код установки до keyexist:
Есть ключ: весь необходимый код после keyexist:

MKN
25-12-2014, 16:35
Используем с помощью функции AddFontResourceEx - на страницах шрифт, НЕ установленный в системе.

Пример 1. Используем свой шрифт для цифрового табло в часиках. Страницу используем с круглым фейсом с перетаскиванием за любую точку, и украсим шрифтом-снежинками. :)

http://s017.radikal.ru/i401/1412/51/d698f1e90643.jpg
комплект для сборки : http://www.mediafire.com/?eh3doa9jt5h34gf


!addplugindir .
!include nsDialogs.nsh
!include WinMessages.nsh
!include "FileFunc.nsh"

Page Custom mypagecreate
Page InstFiles
OutFile "TimeFont_RoundFace.exe"

Var dlg
Var button
Var Font1
Var Label
Var Label2
Var Label3
; рамка вокруг окна цифрового табло (не нужна при чёрном фоне)
!define WS_BORDER 0x00800000

Function .onInit
InitPluginsDir
File "/oname=$pluginsdir\DIGIFACE.ttf" "DIGIFACE.ttf"
System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\DIGIFACE.ttf",i 0x30,i0)'
File "/oname=$pluginsdir\Faux Snow BRK.ttf" "Faux Snow BRK.ttf"
System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\Faux Snow BRK.ttf",i 0x30,i0)'
FunctionEnd

Function .onGUIInit
; вызов DLL для перемещения окна за любую точку
MoveAnywhere::Hook
; окно всегда поверх
System::Call "user32::SetWindowPos(i$HWNDPARENT,i-1,i,i,i,i,i3)"
; убрать заголовок
System::Call `user32::SetWindowLong(i$HWNDPARENT,i${GWL_STYLE},0x9480084C)i.R0`
; убрать пунктирную рамку границы при перетаскивании окна
System::Call "user32::SystemParametersInfo(i0x0025,i0,*i.R0,i0)"
System::Call "user32::SystemParametersInfo(i0x0025,i1,i0,i0)"
FunctionEnd

Function .onGUIEnd
System::Call "user32::SystemParametersInfo(i0x0025,iR0,i0,i0)"
FunctionEnd

Function mypagecreate
nsDialogs::Create 1018
Pop $dlg
; цвет фона страницы (круга)
SetCtlColors $HWNDPARENT "" 0x972FFF
SetCtlColors $dlg "" 0x972FFF

${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$4 : $5 : $6",\
i${DEFAULT_STYLES}|${WS_BORDER},\
i5,i60,i170,i50,i$dlg,i222,i0,i0) i.R2'
; цвет цифры - фон
SetCtlColors $R2 `0xFF0000` `0x000000`

CreateFont $R9 "DIGIFACE" 27
SendMessage $R2 ${WM_SETFONT} $R9 0

${NSD_CreateButton} 50u 82u 30 20 "OFF"
Pop $button
; фейс в виде круга
System::Call "*(i, i, i, i)i.r0"
System::Call "User32::GetClientRect(i$HWNDPARENT, ir0)"
System::Call "*$0(i, i, i.r1, i.r2)"
IntOp $1 $1 + 5
IntOp $2 $2 + 30
System::Call "Gdi32::CreateRoundRectRgn(i0,i0,i200,i200,i200,i200)i.r0"
System::Call "User32::SetWindowRgn(i$HWNDPARENT, ir0, i1)"

; Font снежинки (цифры и буквы - форма снежинок)
CreateFont $Font1 "Faux Snow BRK" 30
${NSD_CreateLabel} 50u 5u 20u 20u "0"
Pop $Label3
SendMessage $Label3 ${WM_SETFONT} $Font1 0
SetCtlColors $Label3 0xFFFFFF 0x972FFF

${NSD_CreateLabel} 20u 78u 20u 20u "0"
Pop $Label
SendMessage $Label ${WM_SETFONT} $Font1 0
SetCtlColors $Label 0xFFFFFF 0x972FFF

${NSD_CreateLabel} 80u 78u 20u 20u "0"
Pop $Label2
SendMessage $Label2 ${WM_SETFONT} $Font1 0
SetCtlColors $Label2 0xFFFFFF 0x972FFF

${NSD_OnClick} $button done
${NSD_CreateTimer} OnTimer 1000
nsDialogs::Show
${NSD_KillTimer} OnTimer
FunctionEnd

Function OnTimer
${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
${NSD_SetText} $R2 "$4 : $5 : $6"
FunctionEnd

Function done
SendMessage $hwndparent ${WM_CLOSE} 0 0
FunctionEnd

Section
SectionEnd



Пример 2. Используем свой шрифт для оригинальных надписей на странице + туда же поместим снежинки

http://s019.radikal.ru/i607/1412/f7/b49e155d669c.jpg
комплект для сборки : http://www.mediafire.com/?re6kc7ts9ww33hd


OutFile "PictBg_Font.exe"
Name "MyFont"

Function onguiinit
InitPluginsDir
File "/oname=$pluginsdir\OdessaScriptFWF.ttf" "OdessaScriptFWF.ttf"
System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\OdessaScriptFWF.ttf",i 0x30,i0)'
File "/oname=$pluginsdir\Faux Snow BRK.ttf" "Faux Snow BRK.ttf"
System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\Faux Snow BRK.ttf",i 0x30,i0)'
File "/oname=$pluginsdir\Almonte Snow.ttf" "Almonte Snow.ttf"
System::Call 'GDI32::AddFontResourceEx(t"$pluginsdir\Almonte Snow.ttf",i 0x30,i0)'
File /oname=$PLUGINSDIR\p.bmp "p.bmp"
FunctionEnd

!define MUI_CUSTOMFUNCTION_GUIINIT onguiinit
!include MUI2.nsh
Page custom fnc_Create
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Var dlg
Var Bitmap
Var BitmapHandle
Var Label
Var Font
Var Label2
Var Font2
Var Label3
Var Font3

Function fnc_Create
nsDialogs::Create 1044
Pop $dlg
GetDlgItem $1 $hwndparent 1028
ShowWindow $1 0
GetDlgItem $1 $hwndparent 1035
ShowWindow $1 0

CreateFont $Font "Faux Snow BRK" 50
${NSD_CreateLabel} 10u 160u 400u 50u "0 1 2 3 4 5 6"
Pop $Label
SendMessage $Label ${WM_SETFONT} $Font 0
SetCtlColors $Label 0x0080FF transparent

CreateFont $Font2 "OdessaScriptFWF" 45
${NSD_CreateLabel} 50u 10u 300u 50u "С Новым Годом !"
Pop $Label2
SendMessage $Label2 ${WM_SETFONT} $Font2 45
SetCtlColors $Label2 0xFF0000 transparent

CreateFont $Font3 "Almonte Snow" 40
${NSD_CreateLabel} 65u 60u 300u 50u "forum.oszone.net"
Pop $Label3
SendMessage $Label3 ${WM_SETFONT} $Font3 40
SetCtlColors $Label3 0x400080 transparent

${NSD_CreateBitmap} 0 0 100% 100% ""
Pop $Bitmap
StrCpy $0 $PLUGINSDIR\p.bmp
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $BitmapHandle
SendMessage $Bitmap ${STM_SETIMAGE} ${IMAGE_BITMAP} $BitmapHandle

nsDialogs::Show
FunctionEnd

Section
SetAutoClose true
SectionEnd

Mafia_forever
29-12-2014, 16:31
Хочу чтоб инсталл копировал файл находящийся рядом сним
Пишу так (File "$EXEDIR\setup.arc) на что компилятор ругается , как решить это ?

Painkiller
29-12-2014, 16:35
Пишу так (File "$EXEDIR\setup.arc) на что компилятор ругается , как решить это ? »

${If} ${FileExists} "$EXEDIR\setup.arc"

тут код копирования

${EndIf}

K.A.V.
29-12-2014, 16:36
Пишу так (File "$EXEDIR\setup.arc) на что компилятор ругается , как решить это ? »
Справочник по NSIS (http://forum.oszone.net/thread-168287.html)
Почитайте различие команд File и Copyfiles

Mafia_forever
31-12-2014, 12:22
Painkiller Большое спасибо!!!

MKN
05-01-2015, 15:41
Бегущая текстовая строка


!include "nsDialogs.nsh"
OutFile "ScrollTxt.exe"
Page custom myPage

var dialog
var txt

Function myPage
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 0 0 100% 8% "С Рождеством ! "
Pop $txt
SetCtlColors $txt 0xFF0000 0xffffff
${NSD_CreateTimer} OnTimer 250
nsDialogs::Show
${NSD_KillTimer} OnTimer
FunctionEnd

Function OnTimer
${NSD_GetText} $txt "$1"
StrCpy $2 $1 1 # в $2 будет помещен первый символ из $1
StrCpy $1 "$1$2" "" 1 # из $1$2 будет отсечен первый символ и помещён в $1
${NSD_SetText} $txt "$1"
FunctionEnd

Section
SectionEnd


В данном примере текст "бежит" справа налево. Вопрос : как изменить направление движения ?

K.A.V.
06-01-2015, 13:18
В данном примере текст "бежит" справа налево. Вопрос : как изменить направление движения ? »
У тебя же код уже есть, достаточно изменить команды StrCpy в нужный формат...


!include "nsDialogs.nsh"
OutFile "ScrollTxt.exe"
Page custom myPage

var dialog
var txt

Function myPage
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 0 0 100% 8% "С Рождеством ! "
Pop $txt
SetCtlColors $txt 0xFF0000 0xffffff
${NSD_CreateTimer} OnTimer 250
nsDialogs::Show
${NSD_KillTimer} OnTimer
FunctionEnd

Function OnTimer
${NSD_GetText} $txt "$1"
StrCpy $2 $1 "" -1
StrCpy $1 "$2$1" -1
${NSD_SetText} $txt "$1"
FunctionEnd

Section
SectionEnd

MKN
06-01-2015, 14:16
K.A.V.,
Вот спасибо ! Как всё просто. А я нагородил, что все буквы, как взрывом разбрасывало по строке... :)

Может подскажешь, как в таком забавном коде, задать конкретное направление (слева-направо) ? А то какие то качели получаются :

Задаём траекторию движения с помощью Math и NsResize плагинов ( http://nsis.sourceforge.net/NsResize_plug-in )



!AddPluginDir .
!include MUI2.nsh
Name MathLabel
OutFile MathLabel_Test.exe

Page Custom MyPage
!insertmacro MUI_LANGUAGE English

Var Label

Function MyPage
nsDialogs::Create 1018
Pop $R0
${NSD_CreateLabel} 100% 100% 60u 10u ` C Рождеством !`
Pop $Label
SetCtlColors $Label 0xFF0000 0xFFFFFF
StrCpy $R0 0
${NSD_CreateTimer} MathMove 50
nsDialogs::Show
${NSD_KillTimer} MathMove
FunctionEnd

Function MathMove
Math::Script `R0 = R0 + 0.05; R1 = 140 + sin(R0) * 140; R2 = 5 + cos(R0) * 0`
nsResize::Set $Label $R1u $R2u `` ``
FunctionEnd

Section
SectionEnd

Движение и скорость, в зависимости от установленных значений, может быть и по окружности и любыми другими загогулинами...
Например, Math::Script `R0 = R0 + 0.1; R1 = 140 + cos(R0) * 140; R2 = 55 + sin(R0) * 50`

K.A.V.
06-01-2015, 17:12
Может подскажешь, как в таком забавном коде, задать конкретное направление (слева-направо) ? »
А ты описание плагинов вообще читаешь, которые в твоих примерах прописаны? :teeth:

nsResize::Set функция для того, чтобы изменить расположение/размер элемента, первые два параметра:
nsResize::Set control_HWND x y width height
соответственно, это и есть то, что тебе нужно, позиция по горизонтали и вертикали соответственно
Math плагин в твоём примере просто генерирует тебе координаты точек, по которым затем nsResize перемещает элемент
Отсюда делаем вывод, что ты можешь простыми командами сам высчитывать необходимые тебе координаты для элемента, как в пример:


!AddPluginDir .
!include MUI2.nsh
Name MathLabel
OutFile MathLabel_Test.exe

Page Custom MyPage
!insertmacro MUI_LANGUAGE English

Var Label

Function MyPage
strcpy $R9 0

nsDialogs::Create 1018
Pop $R0
${NSD_CreateLabel} 100% 100% 60u 10u ` C Рождеством !`
Pop $Label
SetCtlColors $Label 0xFF0000 0xFFFFFF
StrCpy $R0 0
${NSD_CreateTimer} MathMove 50
nsDialogs::Show
${NSD_KillTimer} MathMove
FunctionEnd

Function MathMove
intop $R9 $R9 + 1
StrCmp $R9 "100" 0 +2
strcpy $R9 0
nsResize::Set $Label $R9u $R2u `` ``
FunctionEnd

Section
SectionEnd


Если хочешь делать "туда-сюда" до границ инсталлятора, то тебе нужно сначала рассчитать количество точек в горизонтали интерфейса

MKN
06-01-2015, 21:26
nsResize перемещает элемент
Отсюда делаем вывод, что ты можешь простыми командами сам высчитывать необходимые тебе координаты для элемента »
Это не совсем то, что я имел ввиду... При таком раскладе этот пример мало отличается от предыдщего с манипуляциями с StrCpy.
Интересна "формула" в Math плагине, задающего траекторию движения. Возможно ли изменить математику для прямолинейного одностороннего движения ? Касательно описания этого плагина - а нет никакого внятного описания, окромя запутанного примера, по которому вообще ни черта не понятно... :)

K.A.V.
06-01-2015, 21:49
Тебе что нужно то в итоге? Либо я тебя не понял, либо ты просто закидываешь код ненужными плагинами и командами, т.к.:
При таком раскладе этот пример мало отличается от предыдщего с манипуляциями с StrCpy. »
в корне отличается, там мы просто помещали текст в текстовое поле, а здесь мы переносим весь элемент управления в пределах нашего окна

Возможно ли изменить математику для прямолинейного одностороннего движения ? »
Зачем тебе использовать плагин для этого? Чтобы сделать простейшую операцию сложения?? :dont-know
Я же тебе дал пример, чтобы переместить элемент чисто в горизонтали - нам не нужен плагин Math, если ты хочешь сделать свои карусели, что кружит элемент, как в твоём примере -это другой вопрос

MKN
07-01-2015, 09:17
а здесь мы переносим весь элемент управления в пределах нашего окна »
Да, да , я уже понял это... Интересно, а перемещение элементов с одновременным изменением их размера, например кнопки или собственного окна, возможно ли ? Надо проверить... Такой эффект был бы интересен при наведении указателя мыши на элемент управления, и при этом происходило бы выделение элемента, т.е. увеличение его размера или, как вариант, вибрация элемента (такой эффект уже где то упоминался)...

K.A.V.
07-01-2015, 09:37
Интересно, а перемещение элементов с одновременным изменением их размера, например кнопки или собственного окна, возможно ли ? »
У тебя под носом всё))
Тебе слова width и height в строке
nsResize::Set control_HWND x y width height
ничего не говорят?


!AddPluginDir .
!include MUI2.nsh
Name MathLabel
OutFile MathLabel_Test.exe

Page Custom MyPage
!insertmacro MUI_LANGUAGE English

Var Label

Function MyPage
strcpy $R9 0
strcpy $R5 60
strcpy $R6 10


nsDialogs::Create 1018
Pop $R0
${NSD_CreateLabel} 100% 100% 60u 10u ` C Рождеством !`
Pop $Label
SetCtlColors $Label 0xFF0000 0xFFFFFF
StrCpy $R0 0
${NSD_CreateTimer} MathMove 50
nsDialogs::Show
${NSD_KillTimer} MathMove
FunctionEnd

Function MathMove
intop $R9 $R9 + 1
StrCmp $R9 "100" 0 noreset
strcpy $R9 0
strcpy $R5 60
strcpy $R6 10
noreset:
intop $R5 $R5 + 1
intop $R6 $R6 + 1
nsResize::Set $Label $R9u $R2u `$R5u` `$R6u`
FunctionEnd

Section
SectionEnd

MKN
07-01-2015, 12:32
У тебя под носом всё)) »
Ну, в данный момент не под носом, а только было в планах эксперимента, который ты успешно реализовал. :) Хороший подарок на Рождество. :) Какой однако, интересный плагин - nsResize...

Kopejkin
07-01-2015, 16:39
Чего-то я намутил и теперь у меня проблема с переключением секций. При отказе от установки компонента, возврате на несколько окон назад, а потом снова к выбору компонента, можно выбрать сразу несколько компонентов, что недопустимо. Пришлось маскировать свои косяки "умными" сообщениями о необходимости выбрать только один компонент.

http://savepic.su/4660377m.png (http://savepic.su/4660377.htm)

Код громоздкий, возможно тупой, но нужные мне действия выполняет, если не обращать внимание на описанную выше проблему.
Для удобства сложил все в один архив: ProblemSwitchSections.zip (http://rghost.ru/60187740)

Всех с наступившим Новым годом и рождественскими праздниками!

K.A.V.
08-01-2015, 15:03
Kopejkin, добавь в код переменную в начале кода
var MyVar

и измени кусок:
Function .onSelChange
; Переключатель компонентов
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${LNG}
!insertmacro RadioButton ${DLLB}
!insertmacro RadioButton ${PATCH}
!insertmacro EndRadioButtons
; MessageBox MB_OK "$$1 = $1"
FunctionEnd

на этот:
Function .onSelChange
; Переключатель компонентов
!insertmacro StartRadioButtons $MyVar
!insertmacro RadioButton ${LNG}
!insertmacro RadioButton ${DLLB}
!insertmacro RadioButton ${PATCH}
!insertmacro EndRadioButtons
; MessageBox MB_OK "$$1 = $1"
FunctionEnd

Kopejkin
08-01-2015, 16:01
K.A.V., спасибо большое! Работает. А можно пояснить, так сказать, физический смысл назначения и использования собственной переменной?

K.A.V.
08-01-2015, 17:05
А можно пояснить, так сказать, физический смысл назначения и использования собственной переменной? »
Смысл в том, чтобы не было такой каши при исполнении в инсталляторе, как у вас.
В справочнике гляньте пример, там ещё есть такой вот кусочек кода:


Назначаем по-умолчанию отмеченные

Function .onInit

StrCpy $1 ${ID_2}
StrCpy $2 ${ID_5}

FunctionEnd

Т.е. у нас получается, что при создании группы для одной отметки из нескольких компонентов, нам необходима одна переменная, которая будет хранить данные о том, какой компонент отмечен. А т.к. мы используем дефолтную переменную $1 - значение которой миллион раз может поменяться до момента показа диалога с выбором компонентов - мы и получаем такой бред при исполнении инсталлятора. Пример не очень корректный как в оригинальных примерах из поставки в файлах NSIS (откуда был взят пример и помещен в справочник), да и сама реализация создания таких компонентов кривая, если вы постоянно читаете эту тему - могли заметить, что проблемы с секциями возникают частенько, постоянно NSIS ловит глюки на этой теме, я тут даже кому-то писал собственную функцию onSelChange (там вроде было несколько групп что ли, не помню)
На то время, когда пример был добавлен в справочник - я всех тонкостей этого вопроса не знал, поэтому там пример кода из файлов примеров NSIS
Так что в будущем, во всех ваших кодах сразу создавайте свою переменную для таких компонентов




© OSzone.net 2001-2012