Спасибо, но теперь не фиксируемая кнопка не подсвечивается при нажатии.
Рисованный интерфейс программы
Сообщений 31 страница 60 из 302
Поделиться3222.04.2012 18:17:23
но теперь не фиксируемая кнопка не подсвечивается при нажатии
С этого места по подробнее. Об этом раньше не упоминалось.
Вообще чем подробнее все будет описано, тем лучше.
Поделиться3322.04.2012 18:26:09
С этого места по подробнее.
Нужно чтобы при наведении на любую кнопку подсвечивался ободок вокруг нее(работает).
Кнопки Effect, Battery нефиксируемые, но при нажатии на кнопку она "загорается"(Light_Effect.png, Light_Battery.png), а при отпускании "тухнет".
Кнопка Power наоборот сначала "светится", а при отпускании "тухнет". Как-то так.
Поделиться3422.04.2012 18:37:25
Кнопки Effect, Battery нефиксируемые, но при нажатии на кнопку она "загорается"(Light_Effect.png, Light_Battery.png), а при отпускании "тухнет".
Кнопка Power наоборот сначала "светится", а при отпускании "тухнет". Как-то так.
Разница только в словах "загорается" и "светится".
Я так понял что поведение кнопки Power отличается от остальных, но так и не понял как именно. Ее нужно подсвечивать сразу, а не при нажатии?
Поделиться3522.04.2012 18:47:02
Разница только в словах "загорается" и "светится".
Кнопки Effect, Battery нефиксируемые, но при нажатии на кнопку она подсвечивается(для Effect рисунок Light_Effect.png, для Battery - Light_Battery.png), а при отпускании не подсвечивается(просто картинка фона).
Кнопка Power наоборот сначала подсвечивается, а при нажатии(
иногда нодо смотреть, что копируешь) не подсвечивается.
Поделиться3622.04.2012 18:53:30
Кнопка Power наоборот сначала подсвечивается
При наведении мышки на нее? А когда нажали на ЛКМ, убрать зеленый свет?
Поделиться3722.04.2012 18:57:00
В общем, вот вариант с подсветкой 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Поделиться3822.04.2012 19:29:01
При наведении мышки на нее? А когда нажали на ЛКМ, убрать зеленый свет?
Кнопка Power при запуске проги постоянно подсвечивается зеленым, а при нажатии - тухнет.
Поделиться3922.04.2012 19:30:40
В общем, вот вариант с подсветкой Effect и Battery.

Поделиться4022.04.2012 19:53:23
Кнопка 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Поделиться4122.04.2012 19:54:56
Только заметил, что пропал курсор "рука" при наведении на кнопку.
Поделиться4222.04.2012 19:57:38
Так что ли?
Ну как-то так. Спасибо.
Поделиться4322.04.2012 20:25:24
Только заметил, что пропал курсор "рука" при наведении на кнопку.
Самый простой способ, это добавить эту строку после создания гаджетов.
SetClassLongPtr_(GadgetID(5), #GCL_HCURSOR, LoadCursor_(0, #IDC_HAND))
Недостаток в том, что курсор меняется для всех ImageGadget'ов программы.
Поделиться4422.04.2012 20:32:00
Самый простой способ
Спасибо.
Недостаток в том, что курсор меняется для всех ImageGadget'ов программы.
Думаю меня пока это устроит.
Поделиться4522.04.2012 20:58:08
Думаю меня пока это устроит.
Ан нет, не подходит. Можно еще как-нибудь?
Так как гаджет отключен(DisableGadget(1, 1)), не могу сделать GadgetToolTip(1, "Закрыть"). Как в этом случае поступить?
Поделиться4622.04.2012 21:31:49
Так как гаджет отключен(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Поделиться4722.04.2012 21:51:26
и подсказку можно прикрутить к не отключенному.
До этого почему-то не догадался, спасибо.
Поделиться4823.04.2012 10:31:52
Макрос лучше заменить на такой.
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А то если нажать на не фиксируемую кнопку и не отпуская кнопку мышки, переместить указатель мыши за пределы кнопки, то кнопка останется в нажатом положении.
Поделиться4923.04.2012 12:07:33
Сиасибо, вечером попробую.
Поделиться5023.04.2012 16:46:19
Да, теперь такого нет.
Поделиться5123.04.2012 17:23:42
Полностью не вникал, что нужно max`у(так как у вас тут всё виндовое), но вот здесь есть кнопочки красивые.
Поделиться5223.04.2012 17:26:46
Красивые, но мне нужны именно рисованные.
Поделиться5323.04.2012 19:28:07
Решил добавить кнопку "Свернуть". Добавил ее на фон. Добавил обработку ее нажатия, но возникла проблема: так как за подсветку кнопок отвечает ButtonIm, то при на ведении на кнопку высвечивается ободок, а мне нужно чтобы при наведении на кнопку она сама подсвечивалась. Сейчас она подсвечивается только при нажатии, да и то через раз.
Поделиться5423.04.2012 20:01:08
Изменил макрос.
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Поделиться5523.04.2012 20:12:29
Спасибо.
Поделиться5623.04.2012 20:49:10
Заметил, что при сворачивании в трей и разворачивании четко через раз кнопка "Свернуть" остается подсвеченной, пока курсор не навести на окно программы. Как это лечится?
Поделиться5723.04.2012 22:41:02
Как это лечится?
Обнуляй картинку в гаджете перед тем как развернуть окно или после его сворачивания.
Поделиться5824.04.2012 09:19:01
Спасибо. Вечером отпишусь.
Поделиться5924.04.2012 17:17:57
Сделал так:
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)вроде помогло, но если навести курсор на кнопку "Свернуть" и переместить указатель мыши за пределы кнопки(в данном случае вверх), то кнопка останется в нажатом положении. Код.
Поделиться6024.04.2012 18:27:20
Можно конечно придумать очередной костыль, но все это не очень правильно.
Нужно было изначально делать как в этом примере Вопросы новичка (продолжение…) Это было бы намного оптимальнее и требовало меньше ресурсов компа чем текущее решение.
Ну или использовать 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Похожие темы
| Рисованный интерфейс FM | OpenSource | 27.04.2010 |
| Фон | Вопросы по PureBasic | 16.03.2014 |
| (Статья) Создаем VSM-модель для протеуса (DLL библиотека) | PureBasic для Windows | 17.04.2014 |
| Перевод книги "PureBasic - A Beginners Guide" | Материалы сайта | 04.05.2016 |