Спасибо, но теперь не фиксируемая кнопка не подсвечивается при нажатии.
Рисованный интерфейс программы
Сообщений 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 |