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

Kopejkin
28-02-2014, 11:26
Думаете я просто так... »
И в мыслях не было морочить вам голову!

Ниже приведены сценарии, которые можно сразу скомпилировать и посмотреть результат. Так сказать, работа над ошибками :)
В первом я объединил два совета K.A.V. для branding-текста и текста описания компонентов.
Т.е. цвет branding-текста, текста подсказки и текстов описания компонентов становится красным, стили текстов отключаются.

Скрипт от K.A.V.

;Variant by K.A.V..nsh

!include "mui.nsh"
!include "nsDialogs.nsh"

!define NSD_RemoveStyle "!insertmacro _NSD_RemoveStyle_Call"
!macro _NSD_RemoveStyle_Call CONTROL EXSTYLE
Push `${CONTROL}`
Push `${EXSTYLE}`
System::Store SR1R0
IntOp $R1 $R1 ~
System::Call `user32::GetWindowLong(iR0,i${GWL_STYLE})i.R2`
IntOp $R2 $R1 & $R2
System::Call `user32::SetWindowLong(iR0,i${GWL_STYLE},iR2)`
System::Store L
!macroend

!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_PRE RemoveDISABLEDStyle ; команда отключения стиля для BRANDING.
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description ; отключение стиля описания
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

BrandingText "Nullsoft Scriptable Install System"
Name "'Variant by K.A.V.'"
OutFile "kav.exe"
InstallDir "$TEMP"

Section "Первая секция"
SectionEnd

Section "Вторая секция"
SectionEnd

Function RemoveDISABLEDStyle
GetDlgItem $0 $HWNDPARENT 1028
${NSD_RemoveStyle} $0 0x08000000L
SetCtlColors $0 "0xFF0000" transparent ; Красный цвет текста
FunctionEnd

Function .onMouseOverSection
FindWindow $R0 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R0 1043

StrCmp $0 -1 "" +2
SendMessage $R0 ${WM_SETTEXT} 0 "STR:$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" ; текст
; "Наведите курсор мыши на название компонента, чтобы прочесть его описание."
; в зависимости от языка графического интерфейса
StrCmp $0 0 "" +2
SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание первой секции"

StrCmp $0 1 "" +2
SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание второй секции"
FunctionEnd

Function RemoveDISABLEDStyle_Description
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $1 $0 1043
${NSD_RemoveStyle} $1 0x08000000L
SetCtlColors $1 "0xFF0000" "0xF0F0F0" ; Красный текст на сером фоне (цвет фона-ОБЯЗАТЕЛЬНО)
GetDlgItem $1 $0 1042
SetCtlColors $1 "" "" ; Сейчас установлен прозрачный? цвет фона.
; Белый цвет "0xFFFFFF" фона на слово "Описание".
; Элемент рамки, цвет текста не меняется.
FunctionEnd

А этот вариант предложил Flix. Решает те же задачи.

; Variant by Flix.nsi

!include MUI2.nsh
!include nsDialogs.nsh

!define PRODUCT_NAME "'Variant by Flix'"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"

!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"

; Функция включения элемента с описанием компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Функция включения элемента с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
OutFile "flix.exe"
InstallDir "$TEMP"

Section "Секция 1" SEC1
SectionEnd

Section "Секция 2" SEC2
SectionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
!insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Function onGUIInit
; Получаем дескриптор элемента управления с надписью бренда
GetDlgItem $0 $HWNDPARENT 1028
; Включаем элемент управления (1- включить, 0- отключить)
EnableWindow $0 1
SetCtlColors $0 "0xFF0000" transparent ; Красный цвет текста
FunctionEnd

Function ENABLEDStyle
; Функция включения стиля для элемента с описанием компонентов.
; Выполняем поиск окна
FindWindow $0 "#32770" "" $HWNDPARENT
; Получаем дескриптор элемента управления с описанием компонентов
GetDlgItem $1 $0 1043
; Включаем элемент управления
EnableWindow $1 1
SetCtlColors $1 "0xFF0000" "0xF0F000" ; Красный текст на желтом.
; Желтый выбран для наглядности. Цвет фона задавать ОБЯЗАТЕЛЬНО!
; Если фон прозрачный - тексты описания накладываются.
FunctionEnd

Function ENABLEDStyleOnSel
; Функция включения стиля для элемента с описанием компонентов
; при наведении курсора мышки на компоненты установки.
; Выполняем поиск окна инсталлятора
FindWindow $0 "#32770" "" $HWNDPARENT
; Получаем дескриптор элемента управления с описанием компонентов
GetDlgItem $1 $0 1043
; Включаем элемент управления
EnableWindow $1 1
SetCtlColors $1 "0xFF0000" "0xF0F000" ; Красный текст на желтом фоне
FunctionEnd

Надеюсь, что ничего не переврал.

Я попытался переделать вариант Flix, использующий скины SkinSharp, в инсталлятор с функцией удаления. Чтобы деинсталлятор тоже был "одет". И стили branding-текста и описаний также отключались.
Но запутался окончательно. То uninstall function "***" not referenced, то Function named ".onGUIInit" already exists. То еще чего-нибудь.

Вот все, что у меня получилось. Прошу не бросать на пол-дороги! :)

Применение скина SkinSharp в инсталляторе и деинсталляторе.

Данный код позволяет использовать разное цветовое оформление для инсталлятора и деинстраллятора (в пределах выбранного скина).

http://savepic.su/4186318m.png (http://savepic.su/4186318.htm) http://savepic.su/4192462m.png (http://savepic.su/4192462.htm)


;Uninstall_SkinH.nsh

!include MUI2.nsh
!include nsDialogs.nsh

!define PRODUCT_NAME "'Install-Uninstall SkinH'"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"

!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_PRE RemoveDISABLEDStyle
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"

; Функция включения элемента с описанием компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Функция включения элемента с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"

Name "${PRODUCT_NAME}"
OutFile "UninSkinH.exe"

; The default installation directory
InstallDir $DESKTOP\UninSkinH"

Section "Секция 1" SEC1
SectionEnd

Section "Секция 2" SEC2
SectionEnd

Section ""
SetOutPath $INSTDIR
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
!insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END

Section un."Uninstall Skin"
delete "$INSTDIR\Uninstall.exe"
SetShellVarContext all
RMDir /r "$INSTDIR"
SetAutoClose false
SectionEnd

Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File "D:\NSIS\SkinSharp\DLL\ANSI\SkinH.dll"
File "D:\NSIS\SkinSharp\Skins\0012.she"
;При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i-150,i-0,i-0)
#################### Patches for SkinSharp ####################
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
IntOp $0 $0 + 0x0002CA98
System::Call Kernel32::GetCurrentProcess()i.s
System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
System::Call "*$0(&i1 0)"
###############################################################
FunctionEnd

Function RemoveDISABLEDStyle
; Получаем дескриптор элемента управления с надписью бренда
GetDlgItem $0 $HWNDPARENT 1028
; Включаем элемент управления (1- включить, 0- отключить)
EnableWindow $0 1
FunctionEnd

Function ENABLEDStyle
; Выполняем поиск окна
FindWindow $0 "#32770" "" $HWNDPARENT
; Получаем дескриптор элемента управления с описанием компонентов
GetDlgItem $1 $0 1043
; Включаем элемент управления
EnableWindow $1 1
FunctionEnd

Function ENABLEDStyleOnSel
; Функция включения стиля для элемента с описанием компонентов
; при наведении курсора мышки на компоненты установки.
; Выполняем поиск окна инсталлятора
FindWindow $0 "#32770" "" $HWNDPARENT
; Получаем дескриптор элемента управления с описанием компонентов
GetDlgItem $1 $0 1043
; Включаем элемент управления
EnableWindow $1 1
FunctionEnd

Function un.onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File "D:\NSIS\SkinSharp\DLL\ANSI\SkinH.dll"
File "D:\NSIS\SkinSharp\Skins\0012.she"
;При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i-30,i-0,i-0)
#################### Patches for SkinSharp ####################
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
IntOp $0 $0 + 0x0002CA98
System::Call Kernel32::GetCurrentProcess()i.s
System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
System::Call "*$0(&i1 0)"
###############################################################
FunctionEnd

Function .onGUIEnd
; Удаление временной папки
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
System::Call Kernel32::FreeLibrary(is)
System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

Function un.onGUIEnd
; Удаление временной папки
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
System::Call Kernel32::FreeLibrary(is)
System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

Flix
01-03-2014, 03:26
Я попытался переделать вариант Flix, использующий скины SkinSharp, в инсталлятор с функцией удаления. Чтобы деинсталлятор тоже был "одет". »
Не надо было ничего переделывать, а только по аналогии добавить все тоже самое для деинсталлятора. :)
# Поддержка Unicode
Unicode true

!include MUI2.nsh

!define PRODUCT_NAME "'Install-Uninstall SkinH'"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"


##################### Диалоги ИНСТАЛЛЯЦИИ #######################
; Подключаем стиль оформления к интерфейсу
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
; Показываем диалог приветствия
!insertmacro MUI_PAGE_WELCOME
; Показываем диалог с лицензией
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Docs\Modern UI\License.txt"
; Включаем элемент с описанием компонентов в диалоге компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Включаем элемент с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyle
; Показываем диалог с выбором компонентов установки
!insertmacro MUI_PAGE_COMPONENTS
; Показываем диалог с выбором пути установки
!insertmacro MUI_PAGE_DIRECTORY
; Показываем диалог установки файлов
!insertmacro MUI_PAGE_INSTFILES
; Показываем диалог завершения установки
!insertmacro MUI_PAGE_FINISH
#################################################################

################### Диалоги ДЕИНСТАЛЛЯЦИИ #######################
; Подключаем стиль оформления к интерфейсу
!define MUI_CUSTOMFUNCTION_UNGUIINIT un.onGUIIni
; Показываем диалог приветствия
!insertmacro MUI_UNPAGE_WELCOME
; Показываем диалог подтверждения
!insertmacro MUI_UNPAGE_CONFIRM
; Включаем элемент с описанием компонентов в диалоге компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ENABLEDStyle
; Включаем элемент с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_UNONMOUSEOVERSECTION un.ENABLEDStyle
; Показываем диалог с выбором компонентов деинсталляции
!insertmacro MUI_UNPAGE_COMPONENTS
; Показываем диалог удаления файлов
!insertmacro MUI_UNPAGE_INSTFILES
; Показываем диалог завершения
!insertmacro MUI_UNPAGE_FINISH
#################################################################

; Язык инсталлятора - Русский
!insertmacro MUI_LANGUAGE "Russian"

; Имя инсталлятора
Name "${PRODUCT_NAME}"
; Путь и имя файла инсталлятора
OutFile "UninSkinH.exe"

; Путь установки по умолчанию
InstallDir "$PROGRAMFILES\My application"

Section "Секция 1" SEC1
; Файлы для установки
SectionEnd

Section "Секция 2" SEC2
; Файлы для установки
SectionEnd

Section "Секция 3" SEC3
SetOutPath $INSTDIR
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

; Секция деинсталлятора
Section "Uninstall" SEC4
delete "$INSTDIR\Uninstall.exe"
SetShellVarContext all
RMDir /r "$INSTDIR"
SectionEnd

; Описание компонентов =ИНСТАЛЛЯТОРА=
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
!insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_DESCRIPTION_TEXT ${SEC3} "Описание третьей секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END

; Описание компонентов =ДЕИНСТАЛЛЯТОРА=
!insertmacro MUI_UNFUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC4} "Описание секции деинсталлятора"
!insertmacro MUI_UNFUNCTION_DESCRIPTION_END

; Функция скинизации интерфейса при инициализации GUI =ИНСТАЛЛЯТОРА=
Function onGUIInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
File "${NSISDIR}\Contrib\Skins\0012.she"

# Убираем дефект отображения текста с надписью бренда -------
; Получаем дескриптор элемента управления с надписью бренда
GetDlgItem $0 $HWNDPARENT 1028
; Включаем элемент управления (1- включить, 0- отключить)
EnableWindow $0 1
# -----------------------------------------------------------

;При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i-150,i-0,i-0)

#################### Patches for SkinSharp ####################
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
IntOp $0 $0 + 0x0002CA98
System::Call Kernel32::GetCurrentProcess()i.s
System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
System::Call "*$0(&i1 0)"
###############################################################
FunctionEnd

; Функция выгрузки SkinH.dll при закрытии GUI =ИНСТАЛЛЯТОРА=
Function .onGUIEnd
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
System::Call Kernel32::FreeLibrary(is)
System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

; Функция скинизации интерфейса при инициализации GUI =ДЕИНСТАЛЛЯТОРА=
Function un.onGUIIni
InitPluginsDir
SetOutPath $PLUGINSDIR
File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
File "${NSISDIR}\Contrib\Skins\0012.she"

# Убираем дефект отображения текста с надписью бренда -------
; Получаем дескриптор элемента управления с надписью бренда
GetDlgItem $0 $HWNDPARENT 1028
; Включаем элемент управления (1- включить, 0- отключить)
EnableWindow $0 1
# -----------------------------------------------------------

;При помощи функции SkinH_AttachExt загружаем файл стиля с именем 0012.she
System::Call SkinH::SkinH_AttachExt(t'$PLUGINSDIR\0012.she',,i-30,i-0,i-0)

#################### Patches for SkinSharp ####################
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
IntOp $0 $0 + 0x0002CA98
System::Call Kernel32::GetCurrentProcess()i.s
System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
System::Call "*$0(&i1 0)"
###############################################################
FunctionEnd

; Функция выгрузки SkinH.dll при закрытии GUI =ДЕИНСТАЛЛЯТОРА=
Function un.onGUIEnd
System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
System::Call Kernel32::FreeLibrary(is)
System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

; Функция, которая включает элемент с описанием компонентов.
; Используется для диалога с выбором компонентов при инсталляции.
Function ENABLEDStyle
; Выполняем поиск окна
FindWindow $0 "#32770" "" $HWNDPARENT
; Получаем дескриптор элемента управления с описанием компонентов
GetDlgItem $1 $0 1043
; Включаем элемент управления
EnableWindow $1 1
FunctionEnd

; Функция, которая включает элемент с описанием компонентов.
; Используется для диалога с выбором компонентов при деинсталляции.
Function un.ENABLEDStyle
; Выполняем поиск окна
FindWindow $0 "#32770" "" $HWNDPARENT
; Получаем дескриптор элемента управления с описанием компонентов
GetDlgItem $1 $0 1043
; Включаем элемент управления
EnableWindow $1 1
FunctionEnd

Kopejkin
01-03-2014, 11:23
Теперь, когда такие чайники, как я, будут "доставать" форум подобными вопросами, можно просто указать ссылку. :)
Еще раз спасибо.

4eshireCat
01-03-2014, 20:22
Ребят, пожалуйста подскажите, если кто знает - возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап, как в SkinnedButton? Может быть это возможно как-то реализовать через WinAPI? Сам я пока в этой теме не сильно разбираюсь и буду очень благодарен, если кто-то поможет.

wolkow70
02-03-2014, 16:27
Столкнулся с такой ситуацией, что нужно запустить exe файл на стадии Function .OnInit, то есть на этой стадии файл уже должен быть в папке $PLUGINSDIR , а добиться этого никак не могу. Кто-нибудь поможет?

Begin2Fly
02-03-2014, 16:36
Столкнулся с такой ситуацией, что нужно запустить exe файл на стадии Function .OnInit, то есть на этой стадии файл уже должен быть в папке $PLUGINSDIR , а добиться этого никак не могу. Кто-нибудь поможет? »
InitPluginsDir

MKN
02-03-2014, 16:50
возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап, »
Не подгружая битмап - скорее всего нет.
Может быть это возможно как-то реализовать через WinAPI? »
Дык всё равно придётся загружать битмап с цветом или рисунком...

А почему такая боязнь загрузки битмапа ?

wolkow70
02-03-2014, 17:01
InitPluginsDir »
Пробовал, не получается...

Function .OnInit
;
InitPluginsDir
SetOutPath $PLUGINSDIR
File "DTOOLS\SPTDinst-x86.exe"
ExecWait '"$PLUGINSDIR\SPTDinst-x86.exe" add /q'
FunctionEnd


Файла в папке нет.

Begin2Fly
02-03-2014, 17:10
wolkow70, попробуйте так:

Function .OnInit
InitPluginsDir
File /oname=$PLUGINSDIR\SPTDinst-x86.exe "DTOOLS\SPTDinst-x86.exe"
ExecWait '"$PLUGINSDIR\SPTDinst-x86.exe" add /q'
FunctionEnd

wolkow70
02-03-2014, 17:54
попробуйте так: »

Все равно не распаковывается файл. Хотя сама папка создается, и в ней появляется другой плагин, включенный в скрипт.

Flix
02-03-2014, 18:38
Все равно не распаковывается файл. »
Скачал с оффсайта данный драйвер (SPTD). Добавил в код команды:

Function .onInit
InitPluginsDir
SetOutPath $PLUGINSDIR
File SPTDinst-v186-x86.exe
ExecWait "$PLUGINSDIR\SPTDinst-v186-x86.exe add /q"
FunctionEnd

Скомпилировал, запустил. Все прекрасно распаковывается и запускается. Только вы должны учитывать то факт, что если данный драйвер на вашей системе уже установлен, то повторный запуск установки драйвера с такими параметрами не даст никакого результата. Чтобы проверить, запускается ли файл или нет, уберите ключ add /q. Например, в моем случае я уже получаю сообщение, что для завершения установки драйвера необходима перезагрузка системы.
http://imgs.su/tmp/2014-03-02/1393770854-359.jpg

Если на вашей системе драйвер не установлен, то вы получите стандартное окно исталлятора драйвера.

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

4eshireCat
03-03-2014, 00:45
Не подгружая битмап - скорее всего нет. »

Жаль. На Delfi (http://delphiworld.narod.ru/base/change_button_color.html) это решается вроде без особых проблем, путем отрисовки контрола с использованием стиля BS_OWNERDRAW. Но как это правильно реализовать на NSIS - ума у меня не хватает :dont-know
А почему такая боязнь загрузки битмапа ? »
Дело не в боязни. Просто думал, что есть более универсальный и элегантный способ. Кнопок несколько и они разные. Если для каждой кнопки делать картинку (+варианты), то это не очень удобно.

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

Flix
03-03-2014, 03:41
Ребят, пожалуйста подскажите, если кто знает - возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап »
На 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. Если бы этот способ был универсальней и элегантней, то наверняка бы никто не городил все эти плагины для скинизации интерфейса. Хотя, можете попробовать, а вдруг у вас получится ;) .

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

4eshireCat
04-03-2014, 23:59
Хотя, можете попробовать, а вдруг у вас получится »

Попробовал :) Получился не фонтан конечно, но и не самый плохой вариант:

!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

Flix
06-03-2014, 05:01
Получился не фонтан конечно, но и не самый плохой вариант »
Ну раз пошла такая пьянка, то предлагаю вам такой вариант. Идея заключается в визуализации нажатия кнопки при помощи изменения тени, которую можно создать, разместив под элементом дополнительные статические элементы с соответствующим цветом фона. В данном примере под кнопкой размещены два элемента типа Label без текста. Один смещен влево-вверх на 1 пкс. относительно элемента элемента кнопки, а другой вправо-вниз на 1 пкс. В этом направлении можно фантазировать и дальше, я думаю смысл вам понятен. Чтобы отловить нажатие левой кнопки мышки (WM_LBUTTONDOWN) пришлось задействовать плагин WndSubclass (http://nsis.sourceforge.net/WndSubclass_plug-in). К сожалению, он поддерживает только 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
Не знаю, конечно, где такое может пригодиться, но вдруг у кого-то возникнет такая потребность (типа шутки - красная кнопка с надписью "Не нажимать!" :lol: ).

Во вложении файл сценария и его скомпилированный пример.

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

Flix
06-03-2014, 15:12
Начали с того, что как бы раскрасить кнопку без плагинов, загрузки битмапов и вааще попроще, а закончили громоздской горожей из кода и плагина »
Ах, ну да. Начальным условием задачи было не использовать сторонние плагины :) . Тогда можно сделать так: повесить визуализацию нажатия на функцию обработки клика. Недостаток: эффект будет виден уже после отпускания кнопки мышки. Но, как один из вариантов, вполне приемлем.

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

!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) в функциях обработки кликов для достижения желаемого эффекта.
Вот как это выглядит:
http://imgs.su/tmp/2014-03-06/1394104086-764.jpg

MKN
06-03-2014, 17:03
Flix,
Всё это хорошо, но громоздко в коде + известные недостатки...

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

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




© OSzone.net 2001-2012