Поддерживает ли пурик полупрозрачные текстуры? Можно пример?
Отредактировано max (19.04.2012 20:00:45)
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы
Поддерживает ли пурик полупрозрачные текстуры? Можно пример?
Отредактировано max (19.04.2012 20:00:45)
Поддерживает ли пурик полупрозрачные текстуры? Можно пример?
Смотря что под этим подразумевается.
Была похожая тема. http://purebasic.info/phpBB2/viewtopic.php?t=2241
Смотря что под этим подразумевается.
Полупрозрачные картинки. Нужно при нажатии на кнопку изменить ее цвет.
Например так:
Можно ли вращать изображение вокруг заданной точки?
Отредактировано max (19.04.2012 21:23:58)
Здесь можно использовать две картинки, заменяемые при нажатии кнопки мышки. Но лучше конечно три картинки, чтобы изменялась еще и при наведении.
Пример есть тут. http://purebasic.info/phpBB2/viewtopic. … 0415#30415
Ссылка для скачивания. http://purebasic.info/phpBB2/download.php?id=1154
Можно так же накладывать на основную картинку, другую полупрозрачную (реализуется через альфа-канал). http://purebasic.ru/manual.php?id=9&lng=rus
Можно ли вращать изображение вокруг заданной точки?
Можно. Где-то был пример, найти не могу.
Спасибо, вечером попробую.
Можно ли вращать изображение вокруг заданной точки?
Тут еще есть примеры. Поворот изображения
Вот пример. http://pure-basic.narod.ru/forum/RotateImage.rar
А можно сделать регулятор как в примере, только проще? Или может кто подскажет, как оттуда вытащить код регулятора?
Вроде как регулятор там отдельно в файле KnobSliderGadget.pb.
Ну да. Как сделать в одном файле?
Как сделать в одном файле?
Открыть файл, выделить код, скопировать и вставить в редактор.
Для этого проекта - логично. Мне понадобится 2-3 регулятора. Этот код, как я понял, для одного.
Отредактировано max (20.04.2012 21:11:28)
Пример есть тут. http://purebasic.info/phpBB2/viewtopic.php?p=30415
Ссылка для скачивания. http://purebasic.info/phpBB2/download.php?id=1154
В этих примерах изначально кнопка рисуется. Есть ли пример, где кнопка является фоном?
Отредактировано max (21.04.2012 13:01:36)
Фон тоже нужно рисовать, иначе откуда ему взяться. Или я что-то не так понял?
Фон загружаю так:
OpenWindow(#Window_0,0,0,443,195,"",#PB_Window_BorderLess|#PB_Window_ScreenCentered) SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon))
В архиве все, что сделал.
На нем уже есть кнопки. Так вот как на уже фоне отследить курсор над кнопкой?
Отредактировано max (21.04.2012 18:22:03)
Enumeration #Window_0 #fon #Light_Button_Enable #Light_Pause #Light_Power #Light_Effect #Light_Tune #Light_Battery EndEnumeration UsePNGImageDecoder() Procedure IsMouseOver(wnd) ; Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом GetWindowRect_(wnd,re.RECT) GetCursorPos_(pt.POINT) Result.l = PtInRect_(@re, pt\x | (pt\y<<32) ) ProcedureReturn Result EndProcedure Procedure Close_0(Event) ;Обр.соб close,inf,hide Static but If Event=#WM_MOUSEMOVE ; Переместилась мышка If IsMouseOver(GadgetID(6)) but=1 SetGadgetState(6,ImageID(#Light_Power)) ElseIf IsMouseOver(GadgetID(5)) but=1 SetGadgetState(5,ImageID(#Light_Pause)) ElseIf IsMouseOver(GadgetID(7)) but=1 SetGadgetState(7,ImageID(#Light_Effect)) ElseIf but=1 but=0 SetGadgetState(6,0) SetGadgetState(5,0) SetGadgetState(7,0) EndIf 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) SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon)) ImageGadget(0,38,23,51,50,ImageID(#Light_Button_Enable)) ImageGadget(1,356,23,51,50,ImageID(#Light_Button_Enable)) ImageGadget(2,122,138,51,50,ImageID(#Light_Button_Enable)) ImageGadget(3,197,138,51,50,ImageID(#Light_Button_Enable)) ImageGadget(4,272,138,51,50,ImageID(#Light_Button_Enable)) ImageGadget(5,34,20,58,55,0) ImageGadget(6,353,20,58,55,0) ImageGadget(7,118,139,58,52,0) ImageGadget(8,194,139,58,52,ImageID(#Light_Tune)) ImageGadget(9,270,139,58,52,ImageID(#Light_Battery)) Repeat Event= WaitWindowEvent() Close_0(Event) 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
Более модно использовать изображения на холсте: CanvasGadget, тогда не будет дрожания картинки при движении курсора, или усложнить функцию добавив дополнительные условия.
что-то так:
Procedure Close_0(Event) Static Button, If Event=#WM_MOUSEMOVE ; Переместилась мышка If IsMouseOver(GadgetID(1)) myCursor=LoadCursor_(0,#IDC_HAND) ; курсор рука SetCursor_(myCursor) ; курсор рука If Button=0 Button=1 SetGadgetState(1,ImageID(1)) ;изоброжение при наведении курсора EndIf Else If Button=1 Button=0 SetGadgetState(1,ImageID(2)) ;изоброжение при убратии курсора EndIf EndIf EndIf EndProcedure
Отредактировано mirashic (21.04.2012 20:01:32)
Спасибо, попробую.
вот пример анимации кнопок на холсте:
Enumeration #But1=1 #But2 #But3 #But4 #Window_0 #Image_fon_win EndEnumeration Global Grad1, Grad2, BackColor, FrontColor Grad1 = -200 Grad2 = 300 BackColor= RGB(24, 200, 164) FrontColor=RGB(4, 15, 61) Procedure Fon_win() StartDrawing(CanvasOutput(#Image_fon_win)) DrawingMode(#PB_2DDrawing_AlphaBlend) DrawingMode(#PB_2DDrawing_Gradient) BackColor(BackColor) FrontColor(FrontColor) LinearGradient(0, Grad1, 0, Grad2) Box(0,0,600,400,RGB(128, 128, 128)) StopDrawing() EndProcedure Procedure Img_But1(ID, het, text.s) Width =GadgetWidth(ID) Height =GadgetHeight(ID) yy=GadgetY(ID) For a=0 To 325 Step 4 StartDrawing(CanvasOutput(ID)) DrawingMode(#PB_2DDrawing_Gradient) BackColor(BackColor) FrontColor(FrontColor) LinearGradient(0,Grad1-yy, 0, Grad2-yy) Box(0,0,Width,Height,RGB(0,0,0)) DrawingMode(#PB_2DDrawing_AlphaBlend) Box(0,0,Width,1,RGBA(255,255, 255,50)) Box(0,Height-1,Width,1,RGBA(255,255, 255,50)) Box(0,1,1,Height-1,RGBA(255,255, 255,50)) Box(Width-1,1,1,Height-1,RGBA(255,255, 255,50)) Width_t = (Width-TextWidth(text))/2 Height_t = (Height-TextHeight(text))/2-5 If het=0 DrawText(Width_t,Height_t,text,RGBA(255,255,255,150)) Box(0,a-50,Width,50,RGBA(255,255,255,10)) Box(a-20,0,50,Height,RGBA(255,255,255,10)) ;-------------------------------------------- Box(0,a-50,1,50,RGBA(255,255,255,100)) Box(a-20,0,50,1,RGBA(255,255,255,100)) Box(Width-1,a-50,1,50,RGBA(255,255,255,100)) Box(a-20,Height-1,50,1,RGBA(255,255,255,100)) ElseIf het=1 DrawText(Width_t,Height_t,text,RGBA(255,255,255,100)) Box(0,270-a,Width,50,RGBA(255,255,255,10)) Box(270-a,0,50,Height,RGBA(255,255,255,10)) ;-------------------------------------------- Box(0,270-a,1,50,RGBA(255,255,255,100)) Box(270-a,0,50,1,RGBA(255,255,255,100)) Box(Width-1,270-a,1,50,RGBA(255,255,255,100)) Box(270-a,Height-1,50,1,RGBA(255,255,255,100)) EndIf StopDrawing() Delay(1) Next EndProcedure Dim Text.s(4) Text(#But1)="Кнопка 1" Text(#But2)="Кнопка 2" Text(#But3)="Кнопка 3" Text(#But4)="Кнопка 4" OpenWindow(#Window_0,0,0,600,400,"CanvasGadget",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible) CanvasGadget(#Image_fon_win,0,0,600,400):DisableGadget(#Image_fon_win,1) Fon_win() CanvasGadget(#But1,20,20,190,80) Img_But1(#But1, 0, Text(#But1)) CanvasGadget(#But2,20,110,190,80) Img_But1(#But2, 0, Text(#But2)) CanvasGadget(#But3,20,200,190,80) Img_But1(#But3, 0, Text(#But3)) CanvasGadget(#But4,20,290,190,80) Img_But1(#But4, 0, Text(#But3)) HideWindow(#Window_0,0) Repeat Event = WaitWindowEvent() Gadget = EventGadget() Select Event Case #PB_Event_CloseWindow Break Case #PB_Event_Gadget If EventType() = #PB_EventType_MouseEnter Img_But1(Gadget, 0, Text(Gadget)) ElseIf EventType() = #PB_EventType_MouseLeave Img_But1(Gadget, 1, Text(Gadget)) EndIf Select EventGadget() Case #But1,#But2,#But3,#But4 If EventType()=#PB_EventType_LeftClick Debug Gadget EndIf EndSelect EndSelect ForEver
Отредактировано mirashic (21.04.2012 20:03:54)
Спасибо.
На нем уже есть кнопки. Так вот как на уже фоне отследить курсор над кнопкой?
Там отдельные картинки (ImageGadget'ы) и можно отследить курсор на них.
можно отследить курсор на них
Так и сделано. Теперь другая проблема: надо сделать, чтобы кноки Pause, Power, Tune были фиксируемые, а Effect, Battery - нет.
Попробовал сделать так:
Select Event Case #PB_Event_Gadget Select EventGadget() Case 5 If EventType()=#PB_EventType_LeftClick SetGadgetState(5,ImageID(#Light_Pause)) Delay(200) SetGadgetState(5,0) EndIf EndSelect EndSelect
но что-то не работает. Вот весь код:
Enumeration #Window_0 #fon #close #Light_Button_Enable #Light_Pause #Light_Power #Light_Effect #Light_Tune #Light_Battery EndEnumeration UsePNGImageDecoder() Procedure IsMouseOver(wnd) ; Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом GetWindowRect_(wnd,re.RECT) GetCursorPos_(pt.POINT) Result.l = PtInRect_(@re, pt\x | (pt\y<<32) ) ProcedureReturn Result EndProcedure Procedure Close_0(Event) ;Обр.соб close,inf,hide Static but If Event=#WM_MOUSEMOVE ; Переместилась мышка If IsMouseOver(GadgetID(0)) but=1 SetGadgetState(0,ImageID(#Light_Button_Enable)) ElseIf IsMouseOver(GadgetID(1)) but=1 SetGadgetState(1,ImageID(#Light_Button_Enable)) ElseIf IsMouseOver(GadgetID(2)) but=1 SetGadgetState(2,ImageID(#Light_Button_Enable)) ElseIf IsMouseOver(GadgetID(3)) but=1 SetGadgetState(3,ImageID(#Light_Button_Enable)) ElseIf IsMouseOver(GadgetID(4)) but=1 SetGadgetState(4,ImageID(#Light_Button_Enable)) ElseIf but=1 but=0 SetGadgetState(0,0) SetGadgetState(1,0) SetGadgetState(2,0) SetGadgetState(3,0) SetGadgetState(4,0) EndIf 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) SetWinBackgroundImage(WindowID(#Window_0), ImageID(#fon)) ImageGadget(0,38,23,51,50,0) ImageGadget(1,356,23,51,50,0) ImageGadget(2,122,138,51,50,0) ImageGadget(3,197,138,51,50,0) ImageGadget(4,272,138,51,50,0) ImageGadget(5,34,20,58,55,0) Repeat Event = WaitWindowEvent() Window = EventWindow() Gadget = EventGadget() Close_0(Event) Select Event Case #PB_Event_Gadget Select EventGadget() Case 5 If EventType()=#PB_EventType_LeftClick SetGadgetState(5,ImageID(#Light_Pause)) Delay(200) SetGadgetState(5,0) EndIf EndSelect EndSelect Until Event = #PB_Event_CloseWindow ;Конец главного цикла DataSection ;{ ресурсы fon: IncludeBinary "Main_panel.png" Light_Button_Enable: IncludeBinary "Light_Button_Enable1.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
надо сделать, чтобы кнопки Pause, Power, Tune были фиксируемые, а 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() Declare Close_0(Event) Procedure IsMouseOver(wnd) ; Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом GetWindowRect_(wnd,re.RECT) GetCursorPos_(pt.POINT) Result.l = PtInRect_(@re, pt\x | (pt\y<<32) ) ProcedureReturn Result EndProcedure Macro ButonIm(Sruct_State, Struct_MouseOver, Gadget, Image) If IsMouseOver(GadgetID(Gadget)) but=1 If Sruct_State=0 And Struct_MouseOver=0 SetGadgetState(Gadget,ImageID(#Light_Button_Enable)) EndIf Struct_MouseOver=1 Else Struct_MouseOver=0 If Sruct_State=0 SetGadgetState(Gadget, 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 Sruct_State=0 Struct_MouseOver=0 Close_0(#WM_MOUSEMOVE) EndIf EndIf EndMacro Procedure Close_0(Event) ;Обр.соб close,inf,hide Static but If Event=#WM_MOUSEMOVE ; Переместилась мышка ButonIm(G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 0, #Light_Button_Enable) ButonIm(G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 1, #Light_Button_Enable) ButonIm(G_ButtonInfo\Effect\State, G_ButtonInfo\Effect\MouseOver, 2, #Light_Button_Enable) ButonIm(G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 3, #Light_Button_Enable) ButonIm(G_ButtonInfo\Battery\State, G_ButtonInfo\Battery\MouseOver, 4, #Light_Button_Enable) 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,34,19,51,50,0) ImageGadget(1,356,23,51,50,0) ImageGadget(2,122,138,51,50,0) ImageGadget(3,197,138,51,50,0) ImageGadget(4,272,138,51,50,0) ;ImageGadget(5,34,20,58,55,0, #PB_Image_Border) Repeat Event = WaitWindowEvent() Window = EventWindow() Gadget = EventGadget() Close_0(Event) Select Event Case #PB_Event_Gadget Type=EventType() Select EventGadget() Case 0 ButtonClick(Type, G_ButtonInfo\Pause\State, G_ButtonInfo\Pause\MouseOver, 0, #Light_Pause) Case 1 ButtonClick(Type, G_ButtonInfo\Power\State, G_ButtonInfo\Power\MouseOver, 1, #Light_Pause) Case 2 ButtonClick(Type, G_ButtonInfo\Effect\State, G_ButtonInfo\Effect\MouseOver, 2, #Light_Pause) ; Case 3 ; ButtonClick(Type, G_ButtonInfo\Tune\State, G_ButtonInfo\Tune\MouseOver, 3, #Light_Pause) ; Case 4 ; ButtonClick(Type, G_ButtonInfo\Battery\State, G_ButtonInfo\Battery\MouseOver, 4, #Light_Pause) EndSelect EndSelect Until Event = #PB_Event_CloseWindow ;Конец главного цикла DataSection ;{ ресурсы fon: IncludeBinary "Main_panel.png" Light_Button_Enable: IncludeBinary "Light_Battery.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
Спасибо, что надо.
Спасибо, что надо.
Поторопился. Координаты накладываемых картинок не совпадают, где поправить, не нашел. Подсветка кнопок при нажатии кнопок проподает, повторное наведение не дает ни какого результата, пока не нажмешь ее. Добавил вывод сообщения при нажатии, после закрытия сообщения и перемещения курсора, оно(сообщение) снова выводится. Что делать, не знаю.
Координаты накладываемых картинок не совпадают, где поправить, не нашел.
Нужно правильно обрезать картинки чтобы все совпадало. Можно конечно изменять позиции ImageGadget'ов в окне, но все таки правильнее было бы, подогнать картинки друг к другу.
Подсветка кнопок при нажатии кнопок пропадает
Это в коде так прописано.
Просто не было все требуемых картинок. Нужен полный набор картинок.
Добавил вывод сообщения при нажатии, после закрытия сообщения и перемещения курсора, оно(сообщение) снова выводится. Что делать, не знаю.
Не видя кода сложно сказать что именно не так.
Не видя кода сложно сказать что именно не так.
Нужно правильно обрезать картинки чтобы все совпадало.
В коде есть координаты, все совпадает. Правильно - это как?
В коде есть координаты, все совпадает. Правильно - это как?
Есть смещение примерно на 3 пикселя между Light_Battery.png и остальными рисунками.
Или можно создать отдельные ImageGadget'ы под подсветку кнопки, но их нужно деактивировать, иначе не сможем получить клики по требуемым гаджетам.
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 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) 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 ButtonClick(Type, G_ButtonInfo\Effect\State, G_ButtonInfo\Effect\MouseOver, 7, #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 ButtonClick(Type, G_ButtonInfo\Battery\State, G_ButtonInfo\Battery\MouseOver, 9, #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
Теперь точно как надо. Что нужно изменить, чтобы можно было сделать кнопки не фиксируемые?
Что нужно изменить, чтобы можно было сделать кнопки не фиксируемые?
Убрать вызов макроса ButtonClick() из обработчика кликов кнопки, фиксировать которую не нужно.
Код без фиксации кнопок 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 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) 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 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 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
Рисованный интерфейс FM | OpenSource | 27.04.2010 |
Фон | Вопросы по PureBasic | 16.03.2014 |
(Статья) Создаем VSM-модель для протеуса (DLL библиотека) | PureBasic для Windows | 17.04.2014 |
Перевод книги "PureBasic - A Beginners Guide" | Материалы сайта | 04.05.2016 |
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы