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

Показать сообщение отдельно

Аватара для Flix

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


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

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


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

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

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

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

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

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

XPStyle on

Page custom nsDialogsPage

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

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

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

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

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

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

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

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

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

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

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

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

Section
SectionEnd

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

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

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