Пользователь
Сообщения: 94
Благодарности: 54
|
Профиль
|
Отправить PM
| Цитировать
Цитата 4eshireCat:
Получился не фонтан конечно, но и не самый плохой вариант »
|
Ну раз пошла такая пьянка, то предлагаю вам такой вариант. Идея заключается в визуализации нажатия кнопки при помощи изменения тени, которую можно создать, разместив под элементом дополнительные статические элементы с соответствующим цветом фона. В данном примере под кнопкой размещены два элемента типа Label без текста. Один смещен влево-вверх на 1 пкс. относительно элемента элемента кнопки, а другой вправо-вниз на 1 пкс. В этом направлении можно фантазировать и дальше, я думаю смысл вам понятен. Чтобы отловить нажатие левой кнопки мышки ( WM_LBUTTONDOWN) пришлось задействовать плагин WndSubclass. К сожалению, он поддерживает только ANSI версию NSIS. Высоту кнопок уменьшил, чтобы текст по вертикали смотрелся по центру элемента. Выравнивание по горизонтали делаем пробелами.
читать дальше »
Код:
Код сценария:
; Раскрашиваем кнопки
!include nsDialogs.nsh
!include LogicLib.nsh
!include WinMessages.nsh
!include WndSubclass.nsh
Name "Color Buttons"
OutFile "Color Buttons.exe"
XPStyle on
Page custom nsDialogsPage
Var BUTTONx1 ; элемент кнопка 1
Var Labelx1 ; окантовка кнопки 1 (светлый)
Var Labelx2 ; окантовка кнопки 1 (темный)
Var BUTTONx2 ; элемент кнопка 2
Var Labelx3 ; окантовка кнопки 2 (светлый)
Var Labelx4 ; окантовка кнопки 2 (темный)
Var BUTTONx3 ; элемент кнопка 3
Var Labelx5 ; окантовка кнопки 3 (светлый)
Var Labelx6 ; окантовка кнопки 3 (темный)
Var PressButtonVar1
Var PressButtonVar2
Var PressButtonVar3
; Визуальная обработка кнопки 1 при наведении курсора
Function MouseOver1
System::Alloc 1
Pop $0
System::Call user32::GetCursorPos(ir0)
System::Call *$0(i.r1,i.r2)
System::Free $0
System::Call user32::WindowFromPoint(ir1,ir2)i.r1
${If} $1 = $BUTTONx1
; Цвета элементов при наведении курсора мышки
SetCtlColors $BUTTONx1 0x000000 0x1CCDFF ; кнопка
SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
${Else}
; Обычные цвета элементов
SetCtlColors $BUTTONx1 0x000000 0x0097FF ; кнопка
SetCtlColors $Labelx1 0xFFFFFF 0x005540 ; окантовка кнопки
SetCtlColors $Labelx2 0xFFFFFF 0xB5EEFF ; окантовка кнопки
${EndIf}
; Перерисовка кнопки
System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
; Перерисовка окантовки
System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
FunctionEnd
; Визуальная обработка нажатия кнопки 1
Function PressButton1
${If} $2 = ${WM_LBUTTONDOWN}
SetCtlColors $Labelx1 0xFFFFFF 0xB5EEFF
SetCtlColors $Labelx2 0xFFFFFF 0x005540
; Перерисовываем элемент окантовки
System::Call user32::RedrawWindow(i$Labelx1,i0,i0,i0x0105)
System::Call user32::RedrawWindow(i$Labelx2,i0,i0,i0x0105)
; Изменяем цвет кнопки
SetCtlColors $BUTTONx1 0xFFFFFF 0x0097FF
; Перерисовываем кнопку
System::Call user32::RedrawWindow(i$BUTTONx1,i0,i0,i0x0105)
Sleep 100
${EndIf}
FunctionEnd
; Визуальная обработка кнопки 2 при наведении курсора
Function MouseOver2
System::Alloc 1
Pop $0
System::Call user32::GetCursorPos(ir0)
System::Call *$0(i.r1,i.r2)
System::Free $0
System::Call user32::WindowFromPoint(ir1,ir2)i.r1
${If} $1 = $BUTTONx2
; Цвета элементов при наведении курсора мышки
SetCtlColors $BUTTONx2 0x000000 0x88FF87 ; кнопка
SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
${Else}
; Обычные цвета элементов
SetCtlColors $BUTTONx2 0x000000 0x00FF11 ; кнопка
SetCtlColors $Labelx3 0xFFFFFF 0x007F0E ; окантовка кнопки
SetCtlColors $Labelx4 0xFFFFFF 0xA5FF7F ; окантовка кнопки
${EndIf}
; Перерисовка кнопки
System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
; Перерисовка окантовки
System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
FunctionEnd
; Визуальная обработка нажатия кнопки 2
Function PressButton2
${If} $2 = ${WM_LBUTTONDOWN}
SetCtlColors $Labelx3 0xFFFFFF 0xA5FF7F
SetCtlColors $Labelx4 0xFFFFFF 0x007F0E
; Перерисовываем элемент окантовки
System::Call user32::RedrawWindow(i$Labelx3,i0,i0,i0x0105)
System::Call user32::RedrawWindow(i$Labelx4,i0,i0,i0x0105)
; Изменяем цвет кнопки
SetCtlColors $BUTTONx2 0xFFFFFF 0x34AF00
; Перерисовываем кнопку
System::Call user32::RedrawWindow(i$BUTTONx2,i0,i0,i0x0105)
Sleep 100
${EndIf}
FunctionEnd
; Визуальная обработка кнопки 3 при наведении курсора
Function MouseOver3
System::Alloc 1
Pop $0
System::Call user32::GetCursorPos(ir0)
System::Call *$0(i.r1,i.r2)
System::Free $0
System::Call user32::WindowFromPoint(ir1,ir2)i.r1
${If} $1 = $BUTTONx3
; Цвета элементов при наведении курсора мышки
SetCtlColors $BUTTONx3 0x000000 0xFF4F66 ; кнопка
SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
${Else}
; Обычные цвета элементов
SetCtlColors $BUTTONx3 0x000000 0xFF001F ; кнопка
SetCtlColors $Labelx5 0xFFFFFF 0x890012 ; окантовка кнопки
SetCtlColors $Labelx6 0xFFFFFF 0xFFC6CE ; окантовка кнопки
${EndIf}
; Перерисовка кнопки
System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
; Перерисовка окантовки
System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
FunctionEnd
; Визуальная обработка нажатия кнопки 3
Function PressButton3
${If} $2 = ${WM_LBUTTONDOWN}
SetCtlColors $Labelx5 0xFFFFFF 0xFFC6CE
SetCtlColors $Labelx6 0xFFFFFF 0x890012
; Перерисовываем элемент окантовки
System::Call user32::RedrawWindow(i$Labelx5,i0,i0,i0x0105)
System::Call user32::RedrawWindow(i$Labelx6,i0,i0,i0x0105)
; Изменяем цвет кнопки
SetCtlColors $BUTTONx3 0xFFFFFF 0xCC001B
; Перерисовываем кнопку
System::Call user32::RedrawWindow(i$BUTTONx3,i0,i0,i0x0105)
Sleep 100
${EndIf}
FunctionEnd
; Отрисовка пользовательского диалога
Function nsDialogsPage
nsDialogs::Create 1018
Pop $0
################### Элемент КНОПКА #####################
; Выравнивание текста в элементе по горизонтали выполняем пробелами
nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 50u 50u 40u 10u " Test 1 "
Pop $BUTTONx1
; Задаем функцию для обработки нажатий по кнопке
${NSD_OnClick} $BUTTONx1 Button_x1
; === ОКАНТОВКА КНОПКИ ===
nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 50u 50u 41u 11u ""
Pop $Labelx2
nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 49u 49u 41u 11u ""
Pop $Labelx1
;#######################################################
################## Элемент КНОПКА 2 ####################
; Выравнивание текста в элементе по горизонтали выполняем пробелами
nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 110u 50u 40u 10u " Test 2 "
Pop $BUTTONx2
; Задаем функцию для обработки нажатий по кнопке
${NSD_OnClick} $BUTTONx2 Button_x2
; === ОКАНТОВКА КНОПКИ ===
nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 110u 50u 41u 11u ""
Pop $Labelx4
nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 109u 49u 41u 11u ""
Pop $Labelx3
;#######################################################
################## Элемент КНОПКА 3 ####################
; Выравнивание текста в элементе по горизонтали выполняем пробелами
nsDialogs::CreateControl BUTTON ${WS_VISIBLE}|${WS_CHILD}|${BS_OWNERDRAW}|${WS_TABSTOP} 0 170u 50u 40u 10u " Test 3 "
Pop $BUTTONx3
; Задаем функцию для обработки нажатий по кнопке
${NSD_OnClick} $BUTTONx3 Button_x3
; === ОКАНТОВКА КНОПКИ ===
nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 170u 50u 41u 11u ""
Pop $Labelx6
nsDialogs::CreateControl STATIC ${__NSD_Label_STYLE} 0 169u 49u 41u 11u ""
Pop $Labelx5
;#######################################################
${NSD_CreateTimer} MouseOver1 50
${NSD_CreateTimer} MouseOver2 50
${NSD_CreateTimer} MouseOver3 50
${WndSubclass_Subclass} $BUTTONx1 PressButton1 $PressButtonVar1 $PressButtonVar1
${WndSubclass_Subclass} $BUTTONx2 PressButton2 $PressButtonVar2 $PressButtonVar2
${WndSubclass_Subclass} $BUTTONx3 PressButton3 $PressButtonVar3 $PressButtonVar3
nsDialogs::Show
FunctionEnd
; Функция обработки нажатия по кнопке 1
Function Button_x1
MessageBox MB_OK "Вы нажали кнопку $\"Test 1$\"."
FunctionEnd
; Функция обработки нажатия по кнопке 2
Function Button_x2
MessageBox MB_OK "Вы нажали кнопку $\"Test 2$\"."
FunctionEnd
; Функция обработки нажатия по кнопке 3
Function Button_x3
MessageBox MB_OK "Вы нажали кнопку $\"Test 3$\"."
FunctionEnd
Section
SectionEnd
Не знаю, конечно, где такое может пригодиться, но вдруг у кого-то возникнет такая потребность (типа шутки - красная кнопка с надписью "Не нажимать!" ).
Во вложении файл сценария и его скомпилированный пример.
|