PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы


Рисованный интерфейс программы

Сообщений 31 страница 60 из 302

31

Спасибо, но теперь не фиксируемая кнопка не подсвечивается при нажатии.

0

32

max написал(а):

но теперь не фиксируемая кнопка не подсвечивается при нажатии

С этого места по подробнее. Об этом раньше не упоминалось.
Вообще чем подробнее все будет описано, тем лучше.

0

33

Пётр написал(а):

С этого места по подробнее.

Нужно чтобы при наведении на любую кнопку подсвечивался ободок вокруг нее(работает).
Кнопки Effect, Battery нефиксируемые, но при нажатии на кнопку она "загорается"(Light_Effect.png, Light_Battery.png), а при отпускании "тухнет".
Кнопка Power наоборот сначала "светится", а при отпускании "тухнет". Как-то так.

0

34

max написал(а):

Кнопки Effect, Battery нефиксируемые, но при нажатии на кнопку она "загорается"(Light_Effect.png, Light_Battery.png), а при отпускании "тухнет".
Кнопка Power наоборот сначала "светится", а при отпускании "тухнет". Как-то так.

Разница только в словах "загорается" и "светится".
Я так понял что поведение кнопки Power отличается от остальных, но так и не понял как именно. Ее нужно подсвечивать сразу, а не при нажатии?

0

35

Пётр написал(а):

Разница только в словах "загорается" и "светится".

Кнопки Effect, Battery нефиксируемые, но при нажатии на кнопку она подсвечивается(для Effect рисунок Light_Effect.png, для Battery - Light_Battery.png), а при отпускании не подсвечивается(просто картинка фона).
Кнопка Power наоборот сначала подсвечивается, а при нажатии( :blush: иногда нодо смотреть, что копируешь) не подсвечивается.

0

36

max написал(а):

Кнопка Power наоборот сначала подсвечивается

При наведении мышки на нее? А когда нажали на ЛКМ, убрать зеленый свет?

0

37

В общем, вот вариант с подсветкой Effect и Battery.

Код:
Enumeration 
  #Window_0
  #fon
  #close
  #Light_Button_Enable
  #Light_Pause
  #Light_Power
  #Light_Effect
  #Light_Tune
  #Light_Battery
EndEnumeration 

Structure Buttons
  State.b
  MouseOver.b
EndStructure

Structure ImButtons
  Pause.Buttons
  Power.Buttons
  Effect.Buttons
  Tune.Buttons
  Battery.Buttons
EndStructure

Global G_ButtonInfo.ImButtons

UsePNGImageDecoder()


Procedure IsMouseOver(wnd) ; Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом
 GetWindowRect_(wnd,re.RECT) 
 GetCursorPos_(pt.POINT) 
 Result.l = PtInRect_(@re, pt\x | (pt\y<<32) )
ProcedureReturn Result 
EndProcedure

Macro ButtonIm(Sruct_State, Struct_MouseOver, Gadget, Image)
  
  If IsMouseOver(GadgetID(Gadget))
    If Struct_MouseOver=0
      SetGadgetState(Gadget,ImageID(#Light_Button_Enable))
      Struct_MouseOver=1
    EndIf
  Else
    If Struct_MouseOver=1
      SetGadgetState(Gadget, 0)
      Struct_MouseOver=0
    EndIf
  EndIf
  
EndMacro

Macro ButtonClick(Type, Sruct_State, Struct_MouseOver, Gadget, Image)
  If Type=#PB_EventType_LeftClick Or Type=#PB_EventType_LeftDoubleClick
    If Sruct_State=0
      SetGadgetState(Gadget,ImageID(Image))
      Sruct_State=1
    Else
      If Sruct_State=1
        SetGadgetState(Gadget,0)
        Sruct_State=0
      EndIf
    EndIf
  EndIf
EndMacro

Macro LBUTTONUP(Gadget)
  If IsMouseOver(GadgetID(Gadget))
      SetGadgetState(Gadget,0)
  EndIf
EndMacro

Procedure Close_0(Event)  ;Обр.соб close,inf,hide
  If Event=#WM_MOUSEMOVE ; Переместилась мышка
    
    ButtonIm(G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 0, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 1, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Effect\State, G_ButtonInfo\Effect\MouseOver, 2, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 3, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Battery\State, G_ButtonInfo\Battery\MouseOver, 4, #Light_Button_Enable)
    
  ; Левая кнопка мышки была отпущена
  ElseIf Event=#WM_LBUTTONUP
    
    LBUTTONUP(7)
    LBUTTONUP(9)
    
  ElseIf Event = #WM_LBUTTONDOWN ; Левая кнопка мышки нажата.
    SendMessage_(WindowID(#Window_0),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
  EndIf
EndProcedure

CatchImage(#fon, ?fon)                                   ;фон окна
CatchImage(#Light_Button_Enable, ?Light_Button_Enable)   ;подсветка кнопок
CatchImage(#Light_Pause, ?Light_Pause)                   ;свет кнопки Pause
CatchImage(#Light_Power, ?Light_Power)                   ;свет кнопки Power
CatchImage(#Light_Effect, ?Light_Effect)                 ;свет кнопки Effect
CatchImage(#Light_Tune, ?Light_Tune)                     ;свет кнопки Tune
CatchImage(#Light_Battery, ?Light_Battery)               ;свет кнопки Battery

OpenWindow(#Window_0,0,0,443,195,"",#PB_Window_BorderLess|#PB_Window_ScreenCentered)

; Не у всех установлена библиотека PBOSL.
;SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon))
SetClassLongPtr_(WindowID(#Window_0), #GCL_HBRBACKGROUND, CreatePatternBrush_(ImageID(#fon)))

ImageGadget(0,38,23,51,50,0)   : DisableGadget(0, 1)
ImageGadget(1,356,23,51,50,0)  : DisableGadget(1, 1)
ImageGadget(2,122,138,51,50,0) : DisableGadget(2, 1)
ImageGadget(3,197,138,51,50,0) : DisableGadget(3, 1)
ImageGadget(4,272,138,51,50,0) : DisableGadget(4, 1)

ImageGadget(5,34,20,58,55,0) ;ImageID(#Light_Pause)
ImageGadget(6,353,20,58,55,0) ;ImageID(#Light_Power)
ImageGadget(7,118,139,58,52,0) ;ImageID(#Light_Effect)
ImageGadget(8,194,139,58,52,0) ;ImageID(#Light_Tune)
ImageGadget(9,270,139,58,52,0) ;ImageID(#Light_Battery)

Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
Close_0(Event)

Select Event
  Case #PB_Event_Gadget
    Type=EventType()
    
    ; Нем не нужны другие события ImageGadget'ов.
    If Type=#PB_EventType_LeftClick Or Type=#PB_EventType_LeftDoubleClick
      Select Gadget 
          
        Case 5
          ButtonClick(Type, G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 5, #Light_Pause)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 6
          ButtonClick(Type, G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 6, #Light_Power)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 7
          SetGadgetState(7, ImageID(#Light_Effect))
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 8
          ButtonClick(Type, G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 8, #Light_Tune)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 9
          SetGadgetState(9, ImageID(#Light_Battery))
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
      EndSelect  
    EndIf
  
EndSelect 

Until Event = #PB_Event_CloseWindow ;Конец главного цикла 
  
DataSection
;{ ресурсы
 fon:
 IncludeBinary "Main_panel.png"
 
 Light_Button_Enable:
 IncludeBinary "Light_Button_Enable.png"
 
 Light_Pause:
 IncludeBinary "Light_Pause.png"
 
 Light_Power:
 IncludeBinary "Light_Power.png"
 
 Light_Effect:
 IncludeBinary "Light_Effect.png"
 
 Light_Tune:
 IncludeBinary "Light_Tune.png"
 
 Light_Battery:
 IncludeBinary "Light_Battery.png"  
 
 ;}
EndDataSection

+1

38

Пётр написал(а):

При наведении мышки на нее? А когда нажали на ЛКМ, убрать зеленый свет?

Кнопка Power при запуске проги постоянно подсвечивается зеленым, а при нажатии - тухнет.

0

39

Пётр написал(а):

В общем, вот вариант с подсветкой Effect и Battery.

:cool:

0

40

max написал(а):

Кнопка Power при запуске проги постоянно подсвечивается зеленым, а при нажатии - тухнет.

Так что ли?

Код:
Enumeration 
  #Window_0
  #fon
  #close
  #Light_Button_Enable
  #Light_Pause
  #Light_Power
  #Light_Effect
  #Light_Tune
  #Light_Battery
EndEnumeration 

Structure Buttons
  State.b
  MouseOver.b
EndStructure

Structure ImButtons
  Pause.Buttons
  Power.Buttons
  Effect.Buttons
  Tune.Buttons
  Battery.Buttons
EndStructure

Global G_ButtonInfo.ImButtons

UsePNGImageDecoder()


Procedure IsMouseOver(wnd) ; Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом
 GetWindowRect_(wnd,re.RECT) 
 GetCursorPos_(pt.POINT) 
 Result.l = PtInRect_(@re, pt\x | (pt\y<<32) )
ProcedureReturn Result 
EndProcedure

Macro ButtonIm(Sruct_State, Struct_MouseOver, Gadget, Image)
  
  If IsMouseOver(GadgetID(Gadget))
    If Struct_MouseOver=0
      SetGadgetState(Gadget,ImageID(#Light_Button_Enable))
      Struct_MouseOver=1
    EndIf
  Else
    If Struct_MouseOver=1
      SetGadgetState(Gadget, 0)
      Struct_MouseOver=0
    EndIf
  EndIf
  
EndMacro

Macro ButtonClick(Type, Sruct_State, Struct_MouseOver, Gadget, Image)
  If Type=#PB_EventType_LeftClick Or Type=#PB_EventType_LeftDoubleClick
    If Sruct_State=0
      SetGadgetState(Gadget,ImageID(Image))
      Sruct_State=1
    Else
      If Sruct_State=1
        SetGadgetState(Gadget,0)
        Sruct_State=0
      EndIf
    EndIf
  EndIf
EndMacro

Macro LBUTTONUP(Gadget)
  If IsMouseOver(GadgetID(Gadget))
      SetGadgetState(Gadget,0)
  EndIf
EndMacro

Procedure Close_0(Event)  ;Обр.соб close,inf,hide
  If Event=#WM_MOUSEMOVE ; Переместилась мышка
    
    ButtonIm(G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 0, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 1, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Effect\State, G_ButtonInfo\Effect\MouseOver, 2, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 3, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Battery\State, G_ButtonInfo\Battery\MouseOver, 4, #Light_Button_Enable)
    
  ; Левая кнопка мышки была отпущена
  ElseIf Event=#WM_LBUTTONUP
    
    LBUTTONUP(7)
    LBUTTONUP(9)
    
  ElseIf Event = #WM_LBUTTONDOWN ; Левая кнопка мышки нажата.
    SendMessage_(WindowID(#Window_0),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
  EndIf
EndProcedure

CatchImage(#fon, ?fon)                                   ;фон окна
CatchImage(#Light_Button_Enable, ?Light_Button_Enable)   ;подсветка кнопок
CatchImage(#Light_Pause, ?Light_Pause)                   ;свет кнопки Pause
CatchImage(#Light_Power, ?Light_Power)                   ;свет кнопки Power
CatchImage(#Light_Effect, ?Light_Effect)                 ;свет кнопки Effect
CatchImage(#Light_Tune, ?Light_Tune)                     ;свет кнопки Tune
CatchImage(#Light_Battery, ?Light_Battery)               ;свет кнопки Battery

OpenWindow(#Window_0,0,0,443,195,"",#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)

; Не у всех установлена библиотека PBOSL.
;SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon))
SetClassLongPtr_(WindowID(#Window_0), #GCL_HBRBACKGROUND, CreatePatternBrush_(ImageID(#fon)))

ImageGadget(0,38,23,51,50,0)   : DisableGadget(0, 1)
ImageGadget(1,356,23,51,50,0)  : DisableGadget(1, 1)
ImageGadget(2,122,138,51,50,0) : DisableGadget(2, 1)
ImageGadget(3,197,138,51,50,0) : DisableGadget(3, 1)
ImageGadget(4,272,138,51,50,0) : DisableGadget(4, 1)

ImageGadget(5,34,20,58,55,0) ;ImageID(#Light_Pause)
ImageGadget(6,353,20,58,55,ImageID(#Light_Power)) : G_ButtonInfo\Power\State=1
ImageGadget(7,118,139,58,52,0) ;ImageID(#Light_Effect)
ImageGadget(8,194,139,58,52,0) ;ImageID(#Light_Tune)
ImageGadget(9,270,139,58,52,0) ;ImageID(#Light_Battery)

HideWindow(#Window_0, 0)

Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
Close_0(Event)

Select Event
  Case #PB_Event_Gadget
    Type=EventType()
    
    ; Нем не нужны другие события ImageGadget'ов.
    If Type=#PB_EventType_LeftClick Or Type=#PB_EventType_LeftDoubleClick
      Select Gadget 
          
        Case 5
          ButtonClick(Type, G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 5, #Light_Pause)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 6
          ButtonClick(Type, G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 6, #Light_Power)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 7
          SetGadgetState(7, ImageID(#Light_Effect))
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 8
          ButtonClick(Type, G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 8, #Light_Tune)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 9
          SetGadgetState(9, ImageID(#Light_Battery))
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
      EndSelect  
    EndIf
  
EndSelect 

Until Event = #PB_Event_CloseWindow ;Конец главного цикла 
  
DataSection
;{ ресурсы
 fon:
 IncludeBinary "Main_panel.png"
 
 Light_Button_Enable:
 IncludeBinary "Light_Button_Enable.png"
 
 Light_Pause:
 IncludeBinary "Light_Pause.png"
 
 Light_Power:
 IncludeBinary "Light_Power.png"
 
 Light_Effect:
 IncludeBinary "Light_Effect.png"
 
 Light_Tune:
 IncludeBinary "Light_Tune.png"
 
 Light_Battery:
 IncludeBinary "Light_Battery.png"  
 
 ;}
EndDataSection

+1

41

Только заметил, что пропал курсор "рука" при наведении на кнопку.

0

42

Пётр написал(а):

Так что ли?

Ну как-то так. Спасибо.

0

43

max написал(а):

Только заметил, что пропал курсор "рука" при наведении на кнопку.

Самый простой способ, это добавить эту строку после создания гаджетов.

Код:
SetClassLongPtr_(GadgetID(5), #GCL_HCURSOR, LoadCursor_(0, #IDC_HAND))

Недостаток в том, что курсор меняется для всех ImageGadget'ов программы.

0

44

Пётр написал(а):

Самый простой способ

Спасибо.

Пётр написал(а):

Недостаток в том, что курсор меняется для всех ImageGadget'ов программы.

Думаю меня пока это устроит.

0

45

max написал(а):

Думаю меня пока это устроит.

Ан нет, не подходит. Можно еще как-нибудь?
Так как гаджет отключен(DisableGadget(1, 1)), не могу сделать GadgetToolTip(1, "Закрыть").  Как в этом случае поступить?

0

46

max написал(а):

Так как гаджет отключен(DisableGadget(1, 1)), не могу сделать GadgetToolTip(1, "Закрыть").  Как в этом случае поступить?

Отключен потому что в одной и той же позиции находятся два гаждета и подсказку можно прикрутить к не отключенному.

Код:
Enumeration 
  #Window_0
  #fon
  #close
  #Light_Button_Enable
  #Light_Pause
  #Light_Power
  #Light_Effect
  #Light_Tune
  #Light_Battery
EndEnumeration 

Structure Buttons
  State.b
  MouseOver.b
EndStructure

Structure ImButtons
  Pause.Buttons
  Power.Buttons
  Effect.Buttons
  Tune.Buttons
  Battery.Buttons
EndStructure

Global G_ButtonInfo.ImButtons
IDC_HAND = LoadCursor_(0, #IDC_HAND)

UsePNGImageDecoder()


Procedure IsMouseOver(wnd) ; Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом
 GetWindowRect_(wnd,re.RECT) 
 GetCursorPos_(pt.POINT) 
 Result.l = PtInRect_(@re, pt\x | (pt\y<<32) )
ProcedureReturn Result 
EndProcedure

Macro ButtonIm(Sruct_State, Struct_MouseOver, Gadget, Image)
    
  If IsMouseOver(GadgetID(Gadget))
    If Struct_MouseOver=0
      SetGadgetState(Gadget,ImageID(#Light_Button_Enable))
      Struct_MouseOver=1
    EndIf
    SetCursor_(IDC_HAND)
  Else
    If Struct_MouseOver=1
      SetGadgetState(Gadget, 0)
      Struct_MouseOver=0
    EndIf
  EndIf
  
EndMacro

Macro ButtonClick(Type, Sruct_State, Struct_MouseOver, Gadget, Image)
  If Type=#PB_EventType_LeftClick Or Type=#PB_EventType_LeftDoubleClick
    If Sruct_State=0
      SetGadgetState(Gadget,ImageID(Image))
      Sruct_State=1
    Else
      If Sruct_State=1
        SetGadgetState(Gadget,0)
        Sruct_State=0
      EndIf
    EndIf
  EndIf
EndMacro

Macro LBUTTONUP(Gadget)
  If IsMouseOver(GadgetID(Gadget))
      SetGadgetState(Gadget,0)
  EndIf
EndMacro

Procedure Close_0(Event)  ;Обр.соб close,inf,hide
  Shared IDC_HAND
  
  If Event=#WM_MOUSEMOVE ; Переместилась мышка
    
    ButtonIm(G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 0, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 1, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Effect\State, G_ButtonInfo\Effect\MouseOver, 2, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 3, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Battery\State, G_ButtonInfo\Battery\MouseOver, 4, #Light_Button_Enable)
    
  ; Левая кнопка мышки была отпущена
  ElseIf Event=#WM_LBUTTONUP
    
    LBUTTONUP(7)
    LBUTTONUP(9)
    
  ElseIf Event = #WM_LBUTTONDOWN ; Левая кнопка мышки нажата.
    SendMessage_(WindowID(#Window_0),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
  EndIf
EndProcedure

CatchImage(#fon, ?fon)                                   ;фон окна
CatchImage(#Light_Button_Enable, ?Light_Button_Enable)   ;подсветка кнопок
CatchImage(#Light_Pause, ?Light_Pause)                   ;свет кнопки Pause
CatchImage(#Light_Power, ?Light_Power)                   ;свет кнопки Power
CatchImage(#Light_Effect, ?Light_Effect)                 ;свет кнопки Effect
CatchImage(#Light_Tune, ?Light_Tune)                     ;свет кнопки Tune
CatchImage(#Light_Battery, ?Light_Battery)               ;свет кнопки Battery

OpenWindow(#Window_0,0,0,443,195,"",#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)

; Не у всех установлена библиотека PBOSL.
;SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon))
SetClassLongPtr_(WindowID(#Window_0), #GCL_HBRBACKGROUND, CreatePatternBrush_(ImageID(#fon)))

ImageGadget(0,38,23,51,50,0)   : DisableGadget(0, 1)
ImageGadget(1,356,23,51,50,0)  : DisableGadget(1, 1)
ImageGadget(2,122,138,51,50,0) : DisableGadget(2, 1)
ImageGadget(3,197,138,51,50,0) : DisableGadget(3, 1)
ImageGadget(4,272,138,51,50,0) : DisableGadget(4, 1)

ImageGadget(5,34,20,58,55,0) ;ImageID(#Light_Pause)
ImageGadget(6,353,20,58,55,ImageID(#Light_Power)) : G_ButtonInfo\Power\State=1
ImageGadget(7,118,139,58,52,0) ;ImageID(#Light_Effect)
ImageGadget(8,194,139,58,52,0) ;ImageID(#Light_Tune)
ImageGadget(9,270,139,58,52,0) ;ImageID(#Light_Battery)

GadgetToolTip(5, "Pause")
GadgetToolTip(6, "Закрыть")
GadgetToolTip(7, "Effect")
GadgetToolTip(8, "Tune")
GadgetToolTip(9, "Battery")


HideWindow(#Window_0, 0)

Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
Close_0(Event)

Select Event
  Case #PB_Event_Gadget
    Type=EventType()
    
    ; Нем не нужны другие события ImageGadget'ов.
    If Type=#PB_EventType_LeftClick Or Type=#PB_EventType_LeftDoubleClick
      Select Gadget 
          
        Case 5
          ButtonClick(Type, G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 5, #Light_Pause)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 6
          ButtonClick(Type, G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 6, #Light_Power)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 7
          SetGadgetState(7, ImageID(#Light_Effect))
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 8
          ButtonClick(Type, G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 8, #Light_Tune)
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
        Case 9
          SetGadgetState(9, ImageID(#Light_Battery))
          ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
      EndSelect  
    EndIf
  
EndSelect 

Until Event = #PB_Event_CloseWindow ;Конец главного цикла 
  
DataSection
;{ ресурсы
 fon:
 IncludeBinary "Main_panel.png"
 
 Light_Button_Enable:
 IncludeBinary "Light_Button_Enable.png"
 
 Light_Pause:
 IncludeBinary "Light_Pause.png"
 
 Light_Power:
 IncludeBinary "Light_Power.png"
 
 Light_Effect:
 IncludeBinary "Light_Effect.png"
 
 Light_Tune:
 IncludeBinary "Light_Tune.png"
 
 Light_Battery:
 IncludeBinary "Light_Battery.png"  
 
 ;}
EndDataSection

0

47

Пётр написал(а):

и подсказку можно прикрутить к не отключенному.

До этого почему-то не догадался, спасибо.

0

48

Макрос лучше заменить на такой.

Код:
Macro ButtonIm(Sruct_State, Struct_MouseOver, Gadget, Image)
    
  If IsMouseOver(GadgetID(Gadget))
    If Struct_MouseOver=0
      SetGadgetState(Gadget,ImageID(#Light_Button_Enable))
      Struct_MouseOver=1
    EndIf
    SetCursor_(IDC_HAND)
  Else
    If Struct_MouseOver=1
      SetGadgetState(Gadget, 0)
      Struct_MouseOver=0
    EndIf
    
    CompilerIf Gadget=2 Or Gadget=4
      SetGadgetState(Gadget+5,0)
    CompilerEndIf
    
  EndIf
  
EndMacro

А то если нажать на не фиксируемую кнопку и не отпуская кнопку мышки, переместить указатель мыши за пределы кнопки, то кнопка останется в нажатом положении.

0

49

Сиасибо, вечером попробую.

0

50

Да, теперь такого нет.

0

51

Полностью не вникал, что нужно max`у(так как у вас тут всё виндовое), но вот здесь есть кнопочки красивые.

0

52

Красивые, но мне нужны именно рисованные.

0

53

Решил добавить кнопку "Свернуть". Добавил ее на фон. Добавил обработку ее нажатия, но возникла проблема: так как за подсветку кнопок отвечает ButtonIm, то при на ведении на кнопку высвечивается ободок, а мне нужно чтобы при наведении на кнопку она сама подсвечивалась. Сейчас она подсвечивается только при нажатии, да и то через раз.

0

54

Изменил макрос.

Код:
Macro ButtonIm(Sruct_State, Struct_MouseOver, Gadget, Image)
    
  If IsMouseOver(GadgetID(Gadget))
    If Struct_MouseOver=0
      CompilerIf Gadget<>13
        SetGadgetState(Gadget,ImageID(#Light_Button_Enable))
      CompilerElse
        SetGadgetState(Gadget,ImageID(Image))
      CompilerEndIf
      Struct_MouseOver=1
    EndIf
    SetCursor_(IDC_HAND)
  Else
    If Struct_MouseOver=1
      SetGadgetState(Gadget, 0)
      Struct_MouseOver=0
    EndIf
    
    CompilerIf Gadget=2 Or Gadget=4
      SetGadgetState(Gadget+5,0)
    CompilerEndIf
    
  EndIf
  
EndMacro

+1

55

Спасибо.

0

56

Заметил, что при сворачивании в трей и разворачивании четко через раз кнопка "Свернуть" остается подсвеченной, пока курсор не навести на окно программы. Как это лечится?

0

57

max написал(а):

Как это лечится?

Обнуляй картинку в гаджете перед тем как развернуть окно или после его сворачивания.

0

58

Спасибо. Вечером отпишусь.

0

59

Сделал так:

Код:
        Case 13
          ButtonClick(Type, G_ButtonInfo\Hide\State, G_ButtonInfo\Hide\MouseOver, 13, #Hide)
          HideWindow(#Window_0, 1) 
          ImageGadget(13,422,0,35,35,0)

вроде помогло, но если навести курсор на кнопку "Свернуть" и переместить указатель мыши за пределы кнопки(в данном случае вверх), то кнопка останется в нажатом положении. Код.

0

60

Можно конечно придумать очередной костыль, но все это не очень правильно.
Нужно было изначально делать как в этом примере Вопросы новичка (продолжение…) Это было бы намного оптимальнее и требовало меньше ресурсов компа чем текущее решение.
Ну или использовать CanvasGadget в место ImageGadget, у которого есть событие выхода курсора мышки за пределы гаджета.

Но раз уж начали делать именно так, то специально для ImageGadget'а кнопки "Свернуть", нужно написать обработчик системных событий и ловить событие #WM_MOUSELEAVE которое возникает когда мышка выходит за пределы гаджета.

Код:
Enumeration 
  #Window_0
  #fon
  #Hide
  #Light_Button_Enable
  #Light_Pause
  #Light_Power
  #Light_Effect
  #Light_Tune
  #Light_Battery
EndEnumeration 

Structure Buttons
  State.b
  MouseOver.b
EndStructure

Structure ImButtons
  Pause.Buttons
  Power.Buttons
  Effect.Buttons
  Tune.Buttons
  Battery.Buttons
  Hide.Buttons
EndStructure

Global G_ButtonInfo.ImButtons
IDC_HAND = LoadCursor_(0, #IDC_HAND)

UsePNGImageDecoder()


Structure Button_Image
  *Proc
  Im1_ID.i
  Im2_ID.i
  Im3_ID.i
  FocusState.b
  Click.b
  Gadget.i
EndStructure

Procedure ButtonImage_CB(hWnd, Msg, wParam, lParam)
  Protected Result, *Button_Image.Button_Image
  Protected tme.TRACKMOUSEEVENT
  
  *Button_Image = GetWindowLongPtr_(hWnd,#GWL_USERDATA)
  
  If Msg = #WM_SETCURSOR Or Msg = #WM_MOUSEMOVE Or Msg = #WM_LBUTTONUP
    If *Button_Image\FocusState <> 1
      *Button_Image\FocusState = 1
      tme\cbSize = SizeOf(TRACKMOUSEEVENT)
      tme\dwFlags = #TME_LEAVE
      tme\dwHoverTime = #HOVER_DEFAULT
      tme\hwndTrack = hWnd
      TrackMouseEvent_(@tme)
      If *Button_Image\Click=#False
        SetGadgetState(*Button_Image\Gadget, *Button_Image\Im2_ID)
      Else
        GetAsyncKeyState_(#VK_LBUTTON)
        If GetAsyncKeyState_(#VK_LBUTTON)
          SetGadgetState(*Button_Image\Gadget, *Button_Image\Im3_ID)
        Else
          *Button_Image\Click=#False
          SetGadgetState(*Button_Image\Gadget, *Button_Image\Im2_ID)
        EndIf
      EndIf
    EndIf
    If Msg = #WM_LBUTTONUP
      SetGadgetState(*Button_Image\Gadget, *Button_Image\Im2_ID)
      If *Button_Image\Click=#True
        MessageRequester("", "Клик по гаджету с ID "+Str(*Button_Image\Gadget), #MB_OK)
        *Button_Image\Click=#False
      EndIf
    EndIf
  ElseIf Msg = #WM_MOUSELEAVE
    *Button_Image\FocusState = 0
    SetGadgetState(*Button_Image\Gadget, *Button_Image\Im1_ID)
  ElseIf Msg = #WM_KILLFOCUS
    *Button_Image\FocusState = 0
    SetGadgetState(*Button_Image\Gadget, *Button_Image\Im1_ID)
    *Button_Image\Click=#False
  ElseIf Msg = #WM_LBUTTONDOWN Or Msg = #WM_LBUTTONDBLCLK
    SetGadgetState(*Button_Image\Gadget, *Button_Image\Im3_ID)
    *Button_Image\Click=#True
  EndIf
  
  Result = CallWindowProc_(*Button_Image\Proc, hWnd, Msg, wParam, lParam)
  ProcedureReturn Result
EndProcedure

Procedure ButtonImage(Gadget, x, y, Width, Height, Im1_ID, Im2_ID, Im3_ID)
  Protected Result, *Button_Image.Button_Image
  
  Result=ImageGadget(Gadget, x, y, Width, Height, Im1_ID)
  If Result
    *Button_Image = AllocateMemory(SizeOf(Button_Image))
    If *Button_Image
      *Button_Image\Gadget = Gadget
      *Button_Image\Im1_ID = Im1_ID
      *Button_Image\Im2_ID = Im2_ID
      *Button_Image\Im3_ID = Im3_ID
      *Button_Image\Proc = GetWindowLongPtr_(GadgetID(Gadget), #GWL_WNDPROC)
      SetWindowLongPtr_(GadgetID(Gadget), #GWL_USERDATA, *Button_Image)
      SetWindowLongPtr_(GadgetID(Gadget), #GWL_WNDPROC,  @ButtonImage_CB())
    Else
      FreeGadget(Gadget)
      Result = 0
    EndIf
  EndIf  
    
  ProcedureReturn Result
EndProcedure

Procedure FreeButtonImage(Gadget)
  Protected *p.Button_Image
  *p=GetWindowLongPtr_(GadgetID(Gadget), #GWL_USERDATA)
  If *p
    SetWindowLongPtr_(GadgetID(Gadget), #GWL_WNDPROC, *p\Proc)
    FreeMemory(*p)
  EndIf
  FreeGadget(Gadget)
EndProcedure


Procedure IsMouseOver(wnd) ; Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом
 GetWindowRect_(wnd,re.RECT) 
 GetCursorPos_(pt.POINT) 
 Result.l = PtInRect_(@re, pt\x | (pt\y<<32) )
ProcedureReturn Result 
EndProcedure

Macro ButtonIm(Sruct_State, Struct_MouseOver, Gadget, Image)
    
  If IsMouseOver(GadgetID(Gadget))
    If Struct_MouseOver=0
      CompilerIf Gadget<>13
        SetGadgetState(Gadget,ImageID(#Light_Button_Enable))
      CompilerEndIf
      Struct_MouseOver=1
    EndIf
    SetCursor_(IDC_HAND)
  Else
    If Struct_MouseOver=1
      SetGadgetState(Gadget, 0)
      Struct_MouseOver=0
    EndIf
    
    CompilerIf Gadget=2 Or Gadget=4
      SetGadgetState(Gadget+5,0)
    CompilerEndIf
    
  EndIf
  
EndMacro

Macro ButtonClick(Type, Sruct_State, Struct_MouseOver, Gadget, Image)
  If Type=#PB_EventType_LeftClick; Or Type=#PB_EventType_LeftDoubleClick
    If Sruct_State=0
      SetGadgetState(Gadget,ImageID(Image))
      Sruct_State=1
    Else
      If Sruct_State=1
        SetGadgetState(Gadget,0)
        Sruct_State=0
      EndIf
    EndIf
  EndIf
EndMacro

Macro LBUTTONUP(Gadget)
  If IsMouseOver(GadgetID(Gadget))
      SetGadgetState(Gadget,0)
  EndIf
EndMacro

Procedure Close_0(Event)  ;Обр.соб close,inf,hide
  Shared IDC_HAND
  
  If Event=#WM_MOUSEMOVE ; Переместилась мышка
    
    ButtonIm(G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 0, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 1, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Effect\State, G_ButtonInfo\Effect\MouseOver, 2, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 3, #Light_Button_Enable)
    ButtonIm(G_ButtonInfo\Battery\State, G_ButtonInfo\Battery\MouseOver, 4, #Light_Button_Enable)
    
  ; Левая кнопка мышки была отпущена
  ElseIf Event=#WM_LBUTTONUP
    
    LBUTTONUP(7)
    LBUTTONUP(9)
    
  ElseIf Event = #WM_LBUTTONDOWN ; Левая кнопка мышки нажата.
    SendMessage_(WindowID(#Window_0),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
  EndIf
EndProcedure

CatchImage(#fon, ?fon)                                   ;фон окна
CatchImage(#Light_Button_Enable, ?Light_Button_Enable)   ;подсветка кнопок
CatchImage(#Light_Pause, ?Light_Pause)                   ;свет кнопки Pause
CatchImage(#Light_Power, ?Light_Power)                   ;свет кнопки Power
CatchImage(#Light_Effect, ?Light_Effect)                 ;свет кнопки Effect
CatchImage(#Light_Tune, ?Light_Tune)                     ;свет кнопки Tune
CatchImage(#Light_Battery, ?Light_Battery)               ;свет кнопки Battery
CatchImage(#Hide, ?Hide)                              

OpenWindow(#Window_0,0,0,443,195,"2",#PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)
; Не у всех установлена библиотека PBOSL.
;SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon))
SetClassLongPtr_(WindowID(#Window_0), #GCL_HBRBACKGROUND, CreatePatternBrush_(ImageID(#fon)))

;Добавим иконку в системный трей 
   AddSysTrayIcon(25, WindowID(#Window_0), ExtractIcon_(0,ProgramFilename(),0))
   SysTrayIconToolTip(25, "2") 
      ;Добавим к иконке меню
    CreatePopupMenu(26) 
    MenuItem(1, "Развернуть") 
    MenuItem(2, "Свернуть") 
    MenuBar() 
    MenuItem(10, "Выход") 

ImageGadget(0,38,23,51,50,0)   : DisableGadget(0, 1)
ImageGadget(1,356,23,51,50,0)  : DisableGadget(1, 1)
ImageGadget(2,122,138,51,50,0) : DisableGadget(2, 1)
ImageGadget(3,197,138,51,50,0) : DisableGadget(3, 1)
ImageGadget(4,272,138,51,50,0) : DisableGadget(4, 1)

ButtonImage(13, 422,0,35,35, 0, ImageID(#Hide), ImageID(#Hide))

ImageGadget(5,34,20,58,55,0) ;ImageID(#Light_Pause)
ImageGadget(6,353,20,58,55,ImageID(#Light_Power)) : G_ButtonInfo\Power\State=1
ImageGadget(7,118,139,58,52,0) ;ImageID(#Light_Effect)
ImageGadget(8,194,139,58,52,0) ;ImageID(#Light_Tune)
ImageGadget(9,270,139,58,52,0) ;ImageID(#Light_Battery)

GadgetToolTip(5, "Pause")
GadgetToolTip(6, "Закрыть")
GadgetToolTip(7, "Effect")
GadgetToolTip(8, "Tune")
GadgetToolTip(9, "Battery")


HideWindow(#Window_0, 0)

Repeat
  Event =  WaitWindowEvent() 
  Window = EventWindow() 
  Gadget = EventGadget()
  Close_0(Event)
  
  If Event = #PB_Event_SysTray 
    If EventType() = #PB_EventType_RightClick ; Обработка правой кнопки мышки 
      DisplayPopupMenu(26, WindowID(#Window_0)) ; показ вспывающего меню 
    EndIf 
    If EventType() = #PB_EventType_LeftClick
      
      HideWindow(#Window_0, 0)
      SetWindowState(#Window_0, #PB_Window_Normal) 
    EndIf
  EndIf
  
  If Event = #PB_Event_Menu 
    Select EventMenu() 
      Case 1 ;"Развернуть"  
        HideWindow(0, 0)
        SetWindowState(0, #PB_Window_Normal)     
      Case 2 ;"Свернуть" 
        HideWindow(0, 1)
      Case 10 ;"Выход"
        Break
    EndSelect 
  EndIf 
  
  Select Event
    Case #PB_Event_Gadget
      Type=EventType()
      
      ; Нем не нужны другие события ImageGadget'ов.
      If Type=#PB_EventType_LeftClick Or Type=#PB_EventType_LeftDoubleClick
        Select Gadget 
            
          Case 5
            ButtonClick(Type, G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 5, #Light_Pause)
            ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
          Case 6
            ButtonClick(Type, G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 6, #Light_Power)
            Delay(300)
            Break
          Case 7
            SetGadgetState(7, ImageID(#Light_Effect))
            ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
          Case 8
            ButtonClick(Type, G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 8, #Light_Tune)
            ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
          Case 9
            SetGadgetState(9, ImageID(#Light_Battery))
            ;MessageRequester("Информация", "Была нажата кнопка", #PB_MessageRequester_Ok)
          Case 13
            HideWindow(#Window_0, 1) 
        EndSelect  
      EndIf
      
  EndSelect 

Until Event = #PB_Event_CloseWindow ;Конец главного цикла 
  
DataSection
;{ ресурсы
 fon:
 IncludeBinary "Main_panel.png"
 
 Light_Button_Enable:
 IncludeBinary "Light_Button_Enable.png"
 
 Light_Pause:
 IncludeBinary "Light_Pause.png"
 
 Light_Power:
 IncludeBinary "Light_Power.png"
 
 Light_Effect:
 IncludeBinary "Light_Effect.png"
 
 Light_Tune:
 IncludeBinary "Light_Tune.png"
 
 Light_Battery:
 IncludeBinary "Light_Battery.png"  
 
  Hide:
 IncludeBinary "x_3.png"
 
 ;}
EndDataSection

+1


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы