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

kotkovets
19-12-2013, 21:31
K.A.V., да не отвечай на вопросы, ибо на его писательство не стоит попросту обращать внимания
убрать оффтоп - дело техники модератора

Kopejkin
20-12-2013, 15:41
Попробовал применить скины к инсталлятору с помощью ISSkinEx (MKN (http://forum.oszone.net/post-2219433-536.html))
На некоторых скинах BrandingText выгладит неопрятно.

http://savepic.su/3961769.png

Например: скин tiger

Можно ли что-нибудь сделать?

В Справочнике NSIS есть пример изменения цвета BrandingText.
В стандартном примере скрипта (WelcomeFinish.nsi) - прекрасно работает.
В различных примерах со скинами (см. ссылку MKN выше) - нет.
И что самое обидное ( :lamer: ) в моем, вполне рабочем скрипте без скинов, самодельных окон - в общем, довольно простеньком - тоже не работает. Хотя особой надобности что-либо делать с BrandingText нет - отображается вполне прилично.

Есть ли ограничения применения этого примера? Или что необходимо учитывать?

MKN
20-12-2013, 17:39
Попробовал применить скины к инсталлятору с помощью ISSkinEx
На некоторых скинах BrandingText выгладит неопрятно. »
Возможно дело в самом ISSkinEx. Также можно поэксперементировать с назначением шрифта для BrandingText и с темами.
Самый удачный "кожезаменитель" для NSIS, по моему - это SkinH.dll.


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

!include nsDialogs.nsh
!include WinMessages.nsh
Caption " "
Page Custom mypagecreate
Page InstFiles

OutFile "CreateRoundRectRgn.exe"
Var dlg
var button

Function .onGUIInit
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
System::Call "*(i, i, i, i)i.r0"; создать новую структуру
System::Call "User32::GetClientRect(i$HWNDPARENT, ir0)"; Получить новые координаты структуры - в $0
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"
; Функция SetWindowRgn устанавливает регион окна. Регион окна устанавливает область внутри окна, где система разрешает рисовать.
;Система не выводит на экран любую часть окна, которая находится за пределами региона окна.
; Координаты окна региона окна находятся относительно левого верхнего угла не рабочей области окна.
;После успешного вызова функции SetWindowRgn системе принадлежит регион, определенный дескриптором hRgn региона.
;Система не делает копию региона. Таким образом, Вы не должны делать дополнительные вызовы функции с этим дескриптором региона.
;В частности не удаляйте этот дескриптор региона. Система удаляет дескриптор региона тогда, когда он больше не нужен.
System::Call "User32::SetWindowRgn(i$HWNDPARENT, ir0, i1)"

${NSD_CreateButton} 50u 35u 17u 16u "X"
Pop $button
${NSD_OnClick} $button done
nsDialogs::Show
FunctionEnd

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

Section
SectionEnd


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

Но у меня не получилось - полностью закрасить круг. ( с прямоугольным окном получается).
Как это можно сделать, у кого какие соображения ?

K.A.V.
20-12-2013, 20:00
Но у меня не получилось - полностью закрасить круг. ( с прямоугольным окном получается).
Как это можно сделать, у кого какие соображения ? »

Function mypagecreate
nsDialogs::Create 1018
Pop $dlg
SetCtlColors $HWNDPARENT "" 0x80FF00
SetCtlColors $dlg "" 0x80FF00

kotkovets
21-12-2013, 00:20
Но у меня не получилось - полностью закрасить круг »
не получится просто так - это заголовок окна (стиль окна системы), можно перерисовать заголовок, но стандартно не получится,
а можно убрать у окна заголовок, удалить стиль заголовка, но переместить окошко тогда не удасться

MKN
21-12-2013, 12:35
а можно убрать у окна заголовок, удалить стиль заголовка, но переместить окошко тогда не удасться »
Да, мешает загловок... Убрать его , как уже выясняли, не проблема. Теперь надо организовать возможность перемещения окна НЕ за заголовок.
Самое простое - запускать вместе со скриптом утилитку для этого (типа MoveInactiveWin). Но так не интересно...
В то же время пишут, что можно сделать так : http://computista.ru/030600.shtml
или использовать сообщение WM_NCHITTEST, которое есть даже в WinMessages.nsh.
Только как это сделать на практике ?

kotkovets
21-12-2013, 19:12
Только как это сделать на практике ? »
стандартно невозможно, только плагином

MKN
21-12-2013, 21:06
только плагином »
Которого не существует... Inno в этом плане как то более прогрессивен и продвинут. Чего для него только нет... Для NSIS - чего надо, того никогда нет... :)

wolkow70
23-12-2013, 16:53
Никто не знает как в скрипте NSIS вызвать LaunchAdvancedAssociationUI для заданной программы?
(How to call LaunchAdvancedAssociationUI).

MKN
23-12-2013, 17:43
как в скрипте NSIS вызвать LaunchAdvancedAssociationUI для заданной программы? »
Дело это мутное до безобразия...
Был такой код по теме :

!include LogicLib.nsh
!define CLSCTX_INPROC_SERVER 0x1
!define CLSID_ApplicationAssociationRegistrationUI {1968106d-f3b5-44cf-890e-116fcb9ecef1}
!define IID_IApplicationAssociationRegistrationUI {1f76a169-f994-40ac-8fc8-0959e8874710} ;[Vista+]

section
System::Call 'OLE32::CoCreateInstance(g "${CLSID_ApplicationAssociationRegistrationUI}",i 0,i ${CLSCTX_INPROC_SERVER},g "${IID_IApplicationAssociationRegistrationUI}",*i.r1)i.r0' ;ptr is now in $1 and hr in $0
${If} $1 <> 0
System::Call '$1->3(w "MyApp")i.r0' ;IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI
System::Call '$1->2()' ;IUnknown::Release
${EndIf}
sectionend

Только к нему много вопросов... К примеру, используемая функция IApplicationAssociationRegistrationUI, если верить примечанию, не поддерживается на Windows 8
( http://msdn.microsoft.com/en-us/library/windows/desktop/bb776332(v=vs.85).aspx )
А ты, как мне кажется, хочешь замутить канитель, именно применимо к ассоциированию в Win8 ? (а для других ОС и мутить нечего - всё ясно и традиционно...)

wolkow70
23-12-2013, 17:46
Никто не знает как в скрипте NSIS вызвать LaunchAdvancedAssociationUI для заданной программы? »

Вот сам уже нашел способ: http://ask.make-money-article.com/que/11179945

!include LogicLib.nsh
!define CLSCTX_INPROC_SERVER 0x1
!define CLSID_ApplicationAssociationRegistrationUI {1968106d-f3b5-44cf-890e-116fcb9ecef1}
!define IID_IApplicationAssociationRegistrationUI {1f76a169-f994-40ac-8fc8-0959e8874710} ;[Vista+]

section
;NSIS has called CoInitialize
System::Call 'OLE32::CoCreateInstance(g "${CLSID_ApplicationAssociationRegistrationUI}",i 0,i ${CLSCTX_INPROC_SERVER},g "${IID_IApplicationAssociationRegistrationUI}",*i.r1)i.r0' ;ptr is now in $1 and hr in $0
${If} $1 <> 0
System::Call '$1->3(w "Internet Explorer")i.r0' ;IApplicationAssociationRegistrationUI::LaunchAdvancedAssociationUI
System::Call '$1->2()' ;IUnknown::Release
${EndIf}
sectionend

Вместо "Internet Explorer" можно подставлять наименование программы, зарегистрированной в реестре в ключе
HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications

А ты, как мне кажется, хочешь замутить канитель, именно применимо к ассоциированию в Win8 ? (а для других ОС и мутить нечего - всё ясно и традиционно...) »
Да, чтобы при определении Win8 в конце установки открывался интерфейс ассоциаций для конкретной программы.

MKN
23-12-2013, 17:54
что бы при определении Win8 в конце установки открывался интерфейс ассоциаций для конкретной программы. »
Даже если и получится, то только радости с того мало, т.к. это в ряде случаев оч не удобно и бестолково. Я в соответсвующей теме в Win8, уже про это говорил год назад. Никто даже голоса не подал и ничего не предложил путного...

wolkow70
23-12-2013, 18:48
Даже если и получится, то только радости с того мало »
Получилось, работает! Тестировал на Windows 8 x64.
Применил данной способ в своей сборке Light Alloy.
http://forum.oszone.net/post-2277381-247.html
Интерфейс открывается только на Win 8, и только если при выборе компонентов была выбрана хоть одна ассоциация (и не в тихом режиме).
Можешь познакомиться для интереса.

MKN
23-12-2013, 19:24
Получилось »
Получилось - это когда перед установкой выбрал нужные ассоциации, установил прогу и всё ОК.
А ковыряться с выбором ассоциаций после установки - это лажа.

Krinkels
25-12-2013, 22:00
Друзья, вчера вышла новая версия NSIS( NSIS 3.0a2 ), обновляемся (http://prdownloads.sourceforge.net/nsis/nsis-3.0a2-setup.exe?download)

K.A.V.
26-12-2013, 05:31
Друзья, вчера вышла новая версия NSIS( NSIS 3.0a2 ), обновляемся »
Windows 8.1 & 2012R2 support in WinVer.nsh
Неужели NSIS ожил и пошел в ногу со временем :up

Krinkels
26-12-2013, 07:57
Сам был в шоке, полез за сорцами, а там новая версия висит :)

MKN
26-12-2013, 11:18
Страница-фейс инсталлятора в виде круга.

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

Выглядит это так (ессно, как вариант) :


!addplugindir .
!include nsDialogs.nsh
!include WinMessages.nsh
Page Custom mypagecreate
Page InstFiles

OutFile "CreateRoundRectRgn.exe"
Var dlg
Var button

Function .onInit
InitPluginsDir
File /oname=$PLUGINSDIR\s.bmp "s.bmp"
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 "" 0xbde2f4
SetCtlColors $dlg "" 0xbde2f4

${NSD_CreateButton} 33u 35u 80 59 ""
Pop $button
; устанавливаем свой стиль кнопки (помещаем рисунок на кнопку)
StrCpy $0 $PLUGINSDIR\s.bmp
${NSD_AddExStyle} $button ${WS_EX_TRANSPARENT}|${WS_EX_TOPMOST}
${NSD_AddStyle} $BUTTON "${BS_BITMAP}"
System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s'
Pop $6
SendMessage $BUTTON ${BM_SETIMAGE} ${IMAGE_BITMAP} $6

; фейс в виде круга
System::Call "*(i, i, i, i)i.r0"; создать новую структуру
System::Call "User32::GetClientRect(i$HWNDPARENT, ir0)"; Получить новые координаты структуры - в $0
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)"

${NSD_OnClick} $button done
nsDialogs::Show
FunctionEnd

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

Section
SectionEnd


Ессно кнопку делаем какую угодно и вешаем на неё что угодно.
Правда хотелось таскать фейс с рисунком в качестве фона, но что то у меня перетаскивание при этом не работает... Ну да и ладно...

Flix
26-12-2013, 20:28
Всем привет!

Кто-нибудь собирает себе NSIS из исходников? Вопрос вот в чем. Пробую компилировать NSIS в среде MS Visual Studio 2008 (все настройки по умолчанию). Все чудесно, все собирается, но... не могу понять, почему размеры файлов с шаблонами диалоговых окон (в папке ..NSIS\Contrib\UIs\) у меня получаются больше, чем в официальном релизе?

Оригинал
http://imgs.su/tmp/2013-12-26/1388074359-520.jpg

Моя компиляция
http://imgs.su/tmp/2013-12-26/1388074387-520.jpg

А у вас как? Случаем не знаете, что нужно сделать, чтобы размеры получались меньше? Или не заморачиваться по этому поводу?

Другой вопрос. На сайте загрузки есть архив с названием nsis-3.0a2-strlen_8192.zip. Как надо изменить исходный код программы, чтобы сразу компилировать это "strlen_8192"?

kotkovets
27-12-2013, 01:28
Кто-нибудь собирает себе NSIS из исходников? »
походу только разработчики и занимаются.. :)




© OSzone.net 2001-2012