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

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

Аватара для Flix

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


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

Отправлено: 15:12, 06-03-2014 | #1079