Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


Сообщения: 1216
Благодарности: 486


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

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

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 09-12-2012

 

Аватара для Flix

Пользователь


Сообщения: 87
Благодарности: 49

Профиль | Отправить PM | Цитировать


Цитата wolkow70:
Все равно не распаковывается файл. »
Скачал с оффсайта данный драйвер (SPTD). Добавил в код команды:

Код: Выделить весь код
Function .onInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File SPTDinst-v186-x86.exe
  ExecWait "$PLUGINSDIR\SPTDinst-v186-x86.exe add /q"
FunctionEnd
Скомпилировал, запустил. Все прекрасно распаковывается и запускается. Только вы должны учитывать то факт, что если данный драйвер на вашей системе уже установлен, то повторный запуск установки драйвера с такими параметрами не даст никакого результата. Чтобы проверить, запускается ли файл или нет, уберите ключ add /q. Например, в моем случае я уже получаю сообщение, что для завершения установки драйвера необходима перезагрузка системы.


Если на вашей системе драйвер не установлен, то вы получите стандартное окно исталлятора драйвера.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:38, 02-03-2014 | #1071



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для wolkow70

Ветеран


Сообщения: 3206
Благодарности: 845

Профиль | Отправить PM | Цитировать


Цитата Flix:
Чтобы проверить, запускается ли файл или нет, уберите ключ add /q. »
Да без ключа запустился (в системе есть драйвер). Видимо, запуск и проверка происходят очень быстро, так, что не успевал заметить распаковку файла в папку перед его удалением.

-------
Человек человеку - друг, товарищ и волк!


Отправлено: 18:56, 02-03-2014 | #1072


Новый участник


Сообщения: 10
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата MKN:
Не подгружая битмап - скорее всего нет. »
Жаль. На Delfi это решается вроде без особых проблем, путем отрисовки контрола с использованием стиля BS_OWNERDRAW. Но как это правильно реализовать на NSIS - ума у меня не хватает
Цитата MKN:
А почему такая боязнь загрузки битмапа ? »
Дело не в боязни. Просто думал, что есть более универсальный и элегантный способ. Кнопок несколько и они разные. Если для каждой кнопки делать картинку (+варианты), то это не очень удобно.

PS В любом случае, спасибо за ответ!

Отправлено: 00:45, 03-03-2014 | #1073


Аватара для Flix

Пользователь


Сообщения: 87
Благодарности: 49

Профиль | Отправить PM | Цитировать


Цитата 4eshireCat:
Ребят, пожалуйста подскажите, если кто знает - возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап »
Цитата 4eshireCat:
На Delfi это решается вроде без особых проблем, путем отрисовки контрола с использованием стиля BS_OWNERDRAW. Но как это правильно реализовать на NSIS - ума у меня не хватает »
Здесь также к элементу "Кнопка" надо добавить стиль BS_OWNERDRAW (поддерживается спецификациями NSIS), а затем задать цвет текста и фона. В самом простом варианте:

читать дальше »
Код: Выделить весь код
; Раскрашиваем кнопку

!include nsDialogs.nsh
!include LogicLib.nsh

Name "Color Button"
OutFile "Color Button.exe"

XPStyle on

Page custom nsDialogsPage

Var BUTTON

Function nsDialogsPage

	nsDialogs::Create 1018
	Pop $0

	################### Элемент КНОПКА #####################
	${NSD_CreateButton} 50u 50u 65u 12u "Test"
	Pop $BUTTON
	; Добавляем стиль "BS_OWNERDRAW"
	${NSD_AddStyle} $BUTTON ${BS_OWNERDRAW}
	; Задаем цвет текста (FFD800) и цвет фона (387AFF)
	SetCtlColors $BUTTON 0xFFD800 0x387AFF
	; Задаем функцию для обработки нажатий по кнопке
	GetFunctionAddress $0 OnClick
	nsDialogs::OnClick $BUTTON $0
	;-------------------------------------------------------
	
	nsDialogs::Show

FunctionEnd

; Функция обработки нажатия по кнопке
Function OnClick
	Pop $0 # HWND
	MessageBox MB_OK "Вы нажали кнопку $\"Test$\"."
FunctionEnd

Section
SectionEnd

Недостатки:
- кнопка не имеет фаски (окантовки);
- отсутствует визуализация нажатий и установки фокуса как у обычной кнопки;
- отсутствует центровка текста в элементе (и по высоте, и по ширине).

Для решения этих моментов элементу необходимо каждый раз отправлять сообщение DrawItem (отрисовка элемента - WM_DRAWITEM), которое в свою очередь передает указатель на DrawItemStruct. Это довольно сложно реализовать языком NSIS. Если бы этот способ был универсальней и элегантней, то наверняка бы никто не городил все эти плагины для скинизации интерфейса. Хотя, можете попробовать, а вдруг у вас получится .
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:41, 03-03-2014 | #1074

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Цитата Flix:
к элементу "Кнопка" надо добавить стиль BS_OWNERDRAW »
К сожалению этот способ даже близко не напоминает кнопку и тем более нажатие на кнопку и выглядит как клик на битмап...
Тем не менее, весьма полезен для расширения NSIS-кругозора.
Цитата 4eshireCat:
Если для каждой кнопки делать картинку (+варианты), то это не очень удобно. »
Ничего страшного - всего то пяток строк кода, пусть и для каждой кнопки. Зато нормальный внешний вид кнопки и возможность вариаций с картинками - того стОят.

Последний раз редактировалось MKN, 03-03-2014 в 11:45.


Отправлено: 11:33, 03-03-2014 | #1075


Новый участник


Сообщения: 10
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата Flix:
Хотя, можете попробовать, а вдруг у вас получится »
Попробовал Получился не фонтан конечно, но и не самый плохой вариант:

читать дальше »
Код: Выделить весь код
!include MUI2.nsh
Page custom nsDialogsPage
!insertmacro MUI_LANGUAGE "Russian"

Caption "Create Color Button"
OutFile "ColorButton.exe"
RequestExecutionLevel user

Var Dlg
Var Link
Var Label
Var Button

Function MouseOver
   System::Alloc 1
   Pop $0
   System::Call USER32::GetCursorPos(ir0)
   System::Call *$0(i.r1,i.r2)
   System::Free $0
   System::Call USER32::WindowFromPoint(ir1,ir2)i.r1

${If} $1 = $Label
   SetCtlColors $Label  0xFFFFFF 0x0000FF
${Else}
   SetCtlColors $Label  0xFFFFFF 0xFF0000
${EndIf}
   System::Call user32::RedrawWindow(i$Label,i0,i0,i0x0105)
   
${If} $1 = $Link
   SetCtlColors $Link  0xFFFFFF 0x0000FF
${Else}
   SetCtlColors $Link  0xFFFFFF 0xFF0000
${EndIf}
   System::Call user32::RedrawWindow(i$Link,i0,i0,i0x0105)
   
   ${If} $1 = $Button
   SetCtlColors $Button  0xFFFFFF 0x0000FF
${Else}
   SetCtlColors $Button  0xFFFFFF 0xFF0000
${EndIf}
   System::Call user32::RedrawWindow(i$Button,i0,i0,i0x0105)
FunctionEnd

Function nsDialogsPage
   nsDialogs::Create 1018
   Pop $Dlg

   ####### Вариант 1 (Label) #######
   
   ${NSD_CreateLabel} 100 90 100 40 "Label"
   Pop $Label
   ${NSD_AddStyle} $Label ${SS_CENTER}|${BS_CENTER}
   SetCtlColors $Label 0xFFFFFF 0xFF0000
   ${NSD_OnClick} $Label Label

   ####### Вариант 2 (Link) #######
    
   ${NSD_CreateLink} 250 90 100 40 "$\n              Link             $\n"
   Pop $Link
   SetCtlColors $Link 0xFFFFFF 0xFF0000
   ${NSD_OnClick} $Link Link
   
   ####### Вариант 3 (Button) #######
   
   nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW} 1 175 150 100 40 "$\n          Button           $\n"
   ;${NSD_CreateButton} 175 150 100 40 "$\n          Button           $\n"
   Pop $Button
   ;${NSD_AddStyle} $Button ${BS_OWNERDRAW}
   SetCtlColors $Button 0xFFFFFF 0xFF0000
   ${NSD_OnClick} $Button Button
   
   ${NSD_CreateTimer} MouseOver 50
   nsDialogs::Show
FunctionEnd

Function Label
   System::Call user32::RedrawWindow(i$Label,i0,i0,i0x0105)
   nsResize::Set $Label 101 91 100 40 ; для большего эффекта нажатия делаем перерисовку со смещением на 1 px вправо и вниз
   Sleep 100
   nsResize::Set $Label 100 90 100 40 ; возвращаем "кнопочку" на исходную позицию
   MessageBox MB_OK "Вариант 1 (Label)"
FunctionEnd

Function Link
   System::Call user32::RedrawWindow(i$Link,i0,i0,i0x0105)
   nsResize::Set $Link 251 91 100 40
   Sleep 100
   nsResize::Set $Link 250 90 100 40
   MessageBox MB_OK "Вариант 2 (Link)"
FunctionEnd

Function Button
   System::Call user32::RedrawWindow(i$Button,i0,i0,i0x0105)
   nsResize::Set $Button 176 151 100 40
   Sleep 100
   nsResize::Set $Button 175 150 100 40
   MessageBox MB_OK "Вариант 3 (Button)"
FunctionEnd

Section
SectionEnd

Последний раз редактировалось 4eshireCat, 06-03-2014 в 00:20.


Отправлено: 23:59, 04-03-2014 | #1076


Аватара для Flix

Пользователь


Сообщения: 87
Благодарности: 49

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: 7z ColorButtons.7z
(34.6 Kb, 30 просмотров)

Цитата 4eshireCat:
Получился не фонтан конечно, но и не самый плохой вариант »
Ну раз пошла такая пьянка, то предлагаю вам такой вариант. Идея заключается в визуализации нажатия кнопки при помощи изменения тени, которую можно создать, разместив под элементом дополнительные статические элементы с соответствующим цветом фона. В данном примере под кнопкой размещены два элемента типа Label без текста. Один смещен влево-вверх на 1 пкс. относительно элемента элемента кнопки, а другой вправо-вниз на 1 пкс. В этом направлении можно фантазировать и дальше, я думаю смысл вам понятен. Чтобы отловить нажатие левой кнопки мышки (WM_LBUTTONDOWN) пришлось задействовать плагин WndSubclass. К сожалению, он поддерживает только ANSI версию NSIS. Высоту кнопок уменьшил, чтобы текст по вертикали смотрелся по центру элемента. Выравнивание по горизонтали делаем пробелами.

читать дальше »
Код: Выделить весь код
Код сценария: 

; Раскрашиваем кнопки

!include nsDialogs.nsh
!include LogicLib.nsh
!include WinMessages.nsh
!include WndSubclass.nsh

Name "Color Buttons"
OutFile "Color Buttons.exe"

XPStyle on

Page custom nsDialogsPage

Var BUTTONx1 ; элемент кнопка 1
Var Labelx1  ; окантовка кнопки 1 (светлый)
Var Labelx2  ; окантовка кнопки 1 (темный)
Var BUTTONx2 ; элемент кнопка 2
Var Labelx3  ; окантовка кнопки 2 (светлый)
Var Labelx4  ; окантовка кнопки 2 (темный)
Var BUTTONx3 ; элемент кнопка 3
Var Labelx5  ; окантовка кнопки 3 (светлый)
Var Labelx6  ; окантовка кнопки 3 (темный)
Var PressButtonVar1
Var PressButtonVar2
Var PressButtonVar3

; Визуальная обработка кнопки 1 при наведении курсора
Function MouseOver1
   System::Alloc 1
   Pop $0
   System::Call user32::GetCursorPos(ir0)
   System::Call *$0(i.r1,i.r2)
   System::Free $0
   System::Call user32::WindowFromPoint(ir1,ir2)i.r1
   ${If} $1 = $BUTTONx1
     ; Цвета элементов при наведении курсора мышки
     SetCtlColors $BUTTONx1 0x000000 0x1CCDFF  ; кнопка
     SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
     SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
   ${Else}
     ; Обычные цвета элементов
     SetCtlColors $BUTTONx1 0x000000 0x0097FF  ; кнопка
     SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
     SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
   ${EndIf}
   ; Перерисовка кнопки
   System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
   ; Перерисовка окантовки
   System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
   System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка нажатия кнопки 1
Function PressButton1
    ${If} $2 = ${WM_LBUTTONDOWN}
       SetCtlColors $Labelx1 0xFFFFFF 0xB5EEFF
       SetCtlColors $Labelx2 0xFFFFFF 0x005540
       ; Перерисовываем элемент окантовки
       System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
       System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
       ; Изменяем цвет кнопки
       SetCtlColors $BUTTONx1 0xFFFFFF 0x0097FF
       ; Перерисовываем кнопку
       System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
       Sleep 100
    ${EndIf}
FunctionEnd

; Визуальная обработка кнопки 2 при наведении курсора
Function MouseOver2
   System::Alloc 1
   Pop $0
   System::Call user32::GetCursorPos(ir0)
   System::Call *$0(i.r1,i.r2)
   System::Free $0
   System::Call user32::WindowFromPoint(ir1,ir2)i.r1
   ${If} $1 = $BUTTONx2
     ; Цвета элементов при наведении курсора мышки
     SetCtlColors $BUTTONx2 0x000000 0x88FF87  ; кнопка
     SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
     SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
   ${Else}
     ; Обычные цвета элементов
     SetCtlColors $BUTTONx2 0x000000 0x00FF11  ; кнопка
     SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
     SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
   ${EndIf}
   ; Перерисовка кнопки
   System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
   ; Перерисовка окантовки
   System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
   System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка нажатия кнопки 2
Function PressButton2
    ${If} $2 = ${WM_LBUTTONDOWN}
       SetCtlColors $Labelx3 0xFFFFFF 0xA5FF7F
       SetCtlColors $Labelx4 0xFFFFFF 0x007F0E
       ; Перерисовываем элемент окантовки
       System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
       System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
       ; Изменяем цвет кнопки
       SetCtlColors $BUTTONx2 0xFFFFFF 0x34AF00
       ; Перерисовываем кнопку
       System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
       Sleep 100
    ${EndIf}
FunctionEnd

; Визуальная обработка кнопки 3 при наведении курсора
Function MouseOver3
   System::Alloc 1
   Pop $0
   System::Call user32::GetCursorPos(ir0)
   System::Call *$0(i.r1,i.r2)
   System::Free $0
   System::Call user32::WindowFromPoint(ir1,ir2)i.r1
   ${If} $1 = $BUTTONx3
     ; Цвета элементов при наведении курсора мышки
     SetCtlColors $BUTTONx3 0x000000 0xFF4F66  ; кнопка
     SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
     SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
   ${Else}
     ; Обычные цвета элементов
     SetCtlColors $BUTTONx3 0x000000 0xFF001F  ; кнопка
     SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
     SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
   ${EndIf}
   ; Перерисовка кнопки
   System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
   ; Перерисовка окантовки
   System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
   System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка нажатия кнопки 3
Function PressButton3
    ${If} $2 = ${WM_LBUTTONDOWN}
       SetCtlColors $Labelx5 0xFFFFFF 0xFFC6CE
       SetCtlColors $Labelx6 0xFFFFFF 0x890012
       ; Перерисовываем элемент окантовки
       System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
       System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
       ; Изменяем цвет кнопки
       SetCtlColors $BUTTONx3 0xFFFFFF 0xCC001B
       ; Перерисовываем кнопку
       System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
       Sleep 100
    ${EndIf}
FunctionEnd

; Отрисовка пользовательского диалога
Function nsDialogsPage
	nsDialogs::Create 1018
	Pop $0
	
  ################### Элемент КНОПКА #####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 50u 50u 40u 10u "     Test 1     "
    Pop $BUTTONx1
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx1 Button_x1
	
    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 50u 50u 41u 11u ""
    Pop $Labelx2
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 49u 49u 41u 11u ""
    Pop $Labelx1
  ;#######################################################
  
  ################## Элемент КНОПКА 2 ####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 110u 50u 40u 10u "     Test 2     "
    Pop $BUTTONx2
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx2 Button_x2
	
    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 110u 50u 41u 11u ""
    Pop $Labelx4
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 109u 49u 41u 11u ""
    Pop $Labelx3
  ;#######################################################
  
  ################## Элемент КНОПКА 3 ####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 170u 50u 40u 10u "     Test 3     "
    Pop $BUTTONx3
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx3 Button_x3
	
    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 170u 50u 41u 11u ""
    Pop $Labelx6
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 169u 49u 41u 11u ""
    Pop $Labelx5
  ;#######################################################

	${NSD_CreateTimer} MouseOver1 50
	${NSD_CreateTimer} MouseOver2 50
	${NSD_CreateTimer} MouseOver3 50
	
	${WndSubclass_Subclass} $BUTTONx1 PressButton1 $PressButtonVar1 $PressButtonVar1
	${WndSubclass_Subclass} $BUTTONx2 PressButton2 $PressButtonVar2 $PressButtonVar2
	${WndSubclass_Subclass} $BUTTONx3 PressButton3 $PressButtonVar3 $PressButtonVar3
	nsDialogs::Show
FunctionEnd

; Функция обработки нажатия по кнопке 1
Function Button_x1
	MessageBox MB_OK "Вы нажали кнопку $\"Test 1$\"."
FunctionEnd

; Функция обработки нажатия по кнопке 2
Function Button_x2
	MessageBox MB_OK "Вы нажали кнопку $\"Test 2$\"."
FunctionEnd

; Функция обработки нажатия по кнопке 3
Function Button_x3
	MessageBox MB_OK "Вы нажали кнопку $\"Test 3$\"."
FunctionEnd

Section
SectionEnd

Не знаю, конечно, где такое может пригодиться, но вдруг у кого-то возникнет такая потребность (типа шутки - красная кнопка с надписью "Не нажимать!" ).

Во вложении файл сценария и его скомпилированный пример.
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:01, 06-03-2014 | #1077

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Цитата Flix:
Не знаю, конечно, где такое может пригодиться »
Вот это по нашему ! Начали с того, что как бы раскрасить кнопку без плагинов, загрузки битмапов и вааще попроще, а закончили громоздской горожей из кода и плагина - и всё это для создания псевдокнопки ! Получилась весьма крутая альтернатива традиционному простому коду...
( это я не смеюсь , а восхищаюсь - полёту мысли и фантазии... )
Может когда дождёмся , что кто нибудь и нормальный плагинчик для кнопок напишет. И не только для кнопок... А то давненько для NSIS ничего интересного не появлялось ( а что и появлялось, приходилось клещами вытаскивать у винамповцев... )

Отправлено: 10:27, 06-03-2014 | #1078


Аватара для Flix

Пользователь


Сообщения: 87
Благодарности: 49

Профиль | Отправить PM | Цитировать


Цитата MKN:
Начали с того, что как бы раскрасить кнопку без плагинов, загрузки битмапов и вааще попроще, а закончили громоздской горожей из кода и плагина »
Ах, ну да. Начальным условием задачи было не использовать сторонние плагины . Тогда можно сделать так: повесить визуализацию нажатия на функцию обработки клика. Недостаток: эффект будет виден уже после отпускания кнопки мышки. Но, как один из вариантов, вполне приемлем.

читать дальше »
Код: Выделить весь код
; Раскрашиваем кнопки

!include nsDialogs.nsh
!include LogicLib.nsh


Name "Color Buttons"
OutFile "Color Buttons II.exe"

XPStyle on

Page custom nsDialogsPage

Var BUTTONx1 ; элемент кнопка 1
Var Labelx1  ; окантовка кнопки 1 (светлый)
Var Labelx2  ; окантовка кнопки 1 (темный)
Var BUTTONx2 ; элемент кнопка 2
Var Labelx3  ; окантовка кнопки 2 (светлый)
Var Labelx4  ; окантовка кнопки 2 (темный)
Var BUTTONx3 ; элемент кнопка 3
Var Labelx5  ; окантовка кнопки 3 (светлый)
Var Labelx6  ; окантовка кнопки 3 (темный)


; Визуальная обработка кнопки 1 при наведении курсора
Function MouseOver1
   System::Alloc 1
   Pop $0
   System::Call user32::GetCursorPos(ir0)
   System::Call *$0(i.r1,i.r2)
   System::Free $0
   System::Call user32::WindowFromPoint(ir1,ir2)i.r1
   ${If} $1 = $BUTTONx1
     ; Цвета элементов при наведении курсора мышки
     SetCtlColors $BUTTONx1 0x000000 0x1CCDFF  ; кнопка
     SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
     SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
   ${Else}
     ; Обычные цвета элементов
     SetCtlColors $BUTTONx1 0x000000 0x0097FF  ; кнопка
     SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
     SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
   ${EndIf}
   ; Перерисовка кнопки
   System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
   ; Перерисовка окантовки
   System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
   System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка кнопки 2 при наведении курсора
Function MouseOver2
   System::Alloc 1
   Pop $0
   System::Call user32::GetCursorPos(ir0)
   System::Call *$0(i.r1,i.r2)
   System::Free $0
   System::Call user32::WindowFromPoint(ir1,ir2)i.r1
   ${If} $1 = $BUTTONx2
     ; Цвета элементов при наведении курсора мышки
     SetCtlColors $BUTTONx2 0x000000 0x88FF87  ; кнопка
     SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
     SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
   ${Else}
     ; Обычные цвета элементов
     SetCtlColors $BUTTONx2 0x000000 0x00FF11  ; кнопка
     SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
     SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
   ${EndIf}
   ; Перерисовка кнопки
   System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
   ; Перерисовка окантовки
   System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
   System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
FunctionEnd

; Визуальная обработка кнопки 3 при наведении курсора
Function MouseOver3
   System::Alloc 1
   Pop $0
   System::Call user32::GetCursorPos(ir0)
   System::Call *$0(i.r1,i.r2)
   System::Free $0
   System::Call user32::WindowFromPoint(ir1,ir2)i.r1
   ${If} $1 = $BUTTONx3
     ; Цвета элементов при наведении курсора мышки
     SetCtlColors $BUTTONx3 0x000000 0xFF4F66  ; кнопка
     SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
     SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
   ${Else}
     ; Обычные цвета элементов
     SetCtlColors $BUTTONx3 0x000000 0xFF001F  ; кнопка
     SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
     SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
   ${EndIf}
   ; Перерисовка кнопки
   System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
   ; Перерисовка окантовки
   System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
   System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
FunctionEnd

; Отрисовка пользовательского диалога
Function nsDialogsPage
    nsDialogs::Create 1018
    Pop $0

  ################### Элемент КНОПКА #####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 50u 50u 40u 10u "     Test 1     "
    Pop $BUTTONx1
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx1 Button_x1

    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 50u 50u 41u 11u ""
    Pop $Labelx2
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 49u 49u 41u 11u ""
    Pop $Labelx1
  ;#######################################################

  ################## Элемент КНОПКА 2 ####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 110u 50u 40u 10u "     Test 2     "
    Pop $BUTTONx2
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx2 Button_x2

    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 110u 50u 41u 11u ""
    Pop $Labelx4
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 109u 49u 41u 11u ""
    Pop $Labelx3
  ;#######################################################

  ################## Элемент КНОПКА 3 ####################
    ; Выравнивание текста в элементе по горизонтали выполняем пробелами
    nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 170u 50u 40u 10u "     Test 3     "
    Pop $BUTTONx3
    ; Задаем функцию для обработки нажатий по кнопке
    ${NSD_OnClick} $BUTTONx3 Button_x3
    
    ; === ОКАНТОВКА КНОПКИ ===
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 170u 50u 41u 11u ""
    Pop $Labelx6
    nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 169u 49u 41u 11u ""
    Pop $Labelx5
  ;#######################################################

    ${NSD_CreateTimer} MouseOver1 50
    ${NSD_CreateTimer} MouseOver2 50
    ${NSD_CreateTimer} MouseOver3 50

    nsDialogs::Show
FunctionEnd

; Функция обработки нажатия по кнопке 1
Function Button_x1
       ; Изменяем цвет окантовки
       SetCtlColors $Labelx1 0xFFFFFF 0xB5EEFF
       SetCtlColors $Labelx2 0xFFFFFF 0x005540
       ; Перерисовываем элемент окантовки
       System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
       System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
       ; Изменяем цвет кнопки
       SetCtlColors $BUTTONx1 0xFFFFFF 0x0097FF
       ; Перерисовываем кнопку
       System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
       Sleep 100

    MessageBox MB_OK "Вы нажали кнопку $\"Test 1$\"."
FunctionEnd

; Функция обработки нажатия по кнопке 2
Function Button_x2
       ; Изменяем цвет окантовки
       SetCtlColors $Labelx3 0xFFFFFF 0xA5FF7F
       SetCtlColors $Labelx4 0xFFFFFF 0x007F0E
       ; Перерисовываем элемент окантовки
       System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
       System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
       ; Изменяем цвет кнопки
       SetCtlColors $BUTTONx2 0xFFFFFF 0x34AF00
       ; Перерисовываем кнопку
       System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
       Sleep 100

    MessageBox MB_OK "Вы нажали кнопку $\"Test 2$\"."
FunctionEnd

; Функция обработки нажатия по кнопке 3
Function Button_x3
       ; Изменяем цвет окантовки
       SetCtlColors $Labelx5 0xFFFFFF 0xFFC6CE
       SetCtlColors $Labelx6 0xFFFFFF 0x890012
       ; Перерисовываем элемент окантовки
       System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
       System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
       ; Изменяем цвет кнопки
       SetCtlColors $BUTTONx3 0xFFFFFF 0xCC001B
       ; Перерисовываем кнопку
       System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
       Sleep 100

    MessageBox MB_OK "Вы нажали кнопку $\"Test 3$\"."
FunctionEnd

Section
SectionEnd

Можно поиграться задержкой (sleep) в функциях обработки кликов для достижения желаемого эффекта.
Вот как это выглядит:

Отправлено: 15:12, 06-03-2014 | #1079

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


Flix,
Всё это хорошо, но громоздко в коде + известные недостатки...

Кстати о плагинах. Как то совсем забыли про botva2.dll для InnoSetup...
Всего одна строчка кода (загрузка картинок не в счёт), и на тебе - кнопка... Лишь надо картинку раскрасить по вкусу..

System::Call "botva2::BtnCreate(ir0,i0,i0,i100,i30,t'$PLUGINSDIR\pict_button.bmp',i0,i0)i.R0"
Только неизвестно как там решить вопрос с калбэком при нажатии...

Отправлено: 17:03, 06-03-2014 | #1080



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 dimadr Наборы обновлений для Windows XP/2003/Windows 7 267 14-02-2020 08:25
[архив].: NSIS - все вопросы :. kotkovets Автоматическая установка приложений 3387 09-12-2012 11:56
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 jameszero Наборы обновлений для Windows XP/2003/Windows 7 1491 22-07-2011 22:42
Выбор|модернизация процессора .:[все вопросы]:. Часть I Myxa Выбор отдельных компонентов компьютера и конфигурации в целом 1845 01-01-2011 19:18
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход