Поддерживает ли пурик полупрозрачные текстуры? Можно пример?
Отредактировано 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 » Рисованный интерфейс программы