Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
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, использующий скины 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
возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап, »
Не подгружая битмап - скорее всего нет.
Может быть это возможно как-то реализовать через 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
попробуйте так: »
Все равно не распаковывается файл. Хотя сама папка создается, и в ней появляется другой плагин, включенный в скрипт.
Все равно не распаковывается файл. »
Скачал с оффсайта данный драйвер (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 В любом случае, спасибо за ответ!
Ребят, пожалуйста подскажите, если кто знает - возможно ли на кастомной страничке создать кнопку заданного цвета (например красного) без использования скинов и не подгружая битмап »
На 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. Если бы этот способ был универсальней и элегантней, то наверняка бы никто не городил все эти плагины для скинизации интерфейса. Хотя, можете попробовать, а вдруг у вас получится ;) .
к элементу "Кнопка" надо добавить стиль 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
Получился не фонтан конечно, но и не самый плохой вариант »
Ну раз пошла такая пьянка, то предлагаю вам такой вариант. Идея заключается в визуализации нажатия кнопки при помощи изменения тени, которую можно создать, разместив под элементом дополнительные статические элементы с соответствующим цветом фона. В данном примере под кнопкой размещены два элемента типа 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: ).
Во вложении файл сценария и его скомпилированный пример.
Не знаю, конечно, где такое может пригодиться »
Вот это по нашему ! :) Начали с того, что как бы раскрасить кнопку без плагинов, загрузки битмапов и вааще попроще, а закончили громоздской горожей из кода и плагина - и всё это для создания псевдокнопки ! Получилась весьма крутая альтернатива традиционному простому коду... :)
( это я не смеюсь , а восхищаюсь - полёту мысли и фантазии... :) )
Может когда дождёмся , что кто нибудь и нормальный плагинчик для кнопок напишет. И не только для кнопок... А то давненько для NSIS ничего интересного не появлялось ( а что и появлялось, приходилось клещами вытаскивать у винамповцев... :) )
Начали с того, что как бы раскрасить кнопку без плагинов, загрузки битмапов и вааще попроще, а закончили громоздской горожей из кода и плагина »
Ах, ну да. Начальным условием задачи было не использовать сторонние плагины :) . Тогда можно сделать так: повесить визуализацию нажатия на функцию обработки клика. Недостаток: эффект будет виден уже после отпускания кнопки мышки. Но, как один из вариантов, вполне приемлем.
; Раскрашиваем кнопки
!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
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC