Пользователь
Сообщения: 98
Благодарности: 55
|
Профиль
|
Отправить 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) в функциях обработки кликов для достижения желаемого эффекта.
Вот как это выглядит:
|