Можно ведь самому нарисовать - сделать из ImageGadget'а или CanvasGadget'а.
Можно поподробней или пример?
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы
Можно ведь самому нарисовать - сделать из ImageGadget'а или CanvasGadget'а.
Можно поподробней или пример?
Определяем что была нажата левая кнопка мышки, или перемещена мышь и по текущим координатам курсора, передвигаем рисованный ползунок (картинку).
Понял, буду пробовать.
Было бы проще если бы был не только скрин, но и код.
Если нужно поместить рисунок в произвольную часть, то так:
StartDrawing(CanvasOutput(0)) DrawImage(ImageID(#Window_5), x, y) StopDrawing()
А если просто загрузить фоновый рисунок на весь CanvasGadget, то так:
SetGadgetAttribute(0, #PB_Canvas_Image, ImageID(#Window_5))
В справке это написано. http://purebasic.com/documentation/gadg … adget.html
Вот код:
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(0,0,0,258,123,ImageID(#Window_5))
CanvasGadget(1, 10, 10, 24, 15,#PB_Canvas_ClipMouse)
StartDrawing(CanvasOutput(1))
StopDrawing()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "TrackBarGadget.png"
Window_4:
IncludeBinary "H-knob3.png"
;}
EndDataSectionВыше уже написал как нужно сделать.
Это я понял. 
Сделал так:
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
CatchImage(#Window_4, ?Window_4)
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(0,0,0,258,123,ImageID(#Window_5))
CanvasGadget(1, 20, 28, 24, 15)
StartDrawing(CanvasOutput(1))
DrawImage(ImageID(#Window_4), 0, 0)
StopDrawing()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "TrackBarGadget.png"
Window_4:
IncludeBinary "H-knob3.png"
;}
EndDataSectionРисунок выводится так:
а должен быть просто бегунок. 
Если нужно наложить рисунок с альфа каналом, то следует использовать функцию DrawAlphaImage().
Спасибо, завтра попробую.
Привет.
Сделал с DrawAlphaImage():
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
CatchImage(#Window_4, ?Window_4)
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(0,0,0,258,123,ImageID(#Window_5))
CanvasGadget(1, 20, 28, 24, 15)
StartDrawing(CanvasOutput(1))
DrawAlphaImage(ImageID(#Window_4), 0, 0)
StopDrawing()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "TrackBarGadget.png"
Window_4:
IncludeBinary "H-knob3.png"
;}
EndDataSectionРисунок теперь такой:
С ImageGadget такого не было. Или я что-то не так делаю?
Или я что-то не так делаю?
Канвас не поддерживает прозрачность, т.е. фон канваса всегда непрозрачен. Костыльный выход - это закрасить "H-knob3.png" вокруг ползунка, в цвет подложки.
Почему бы в место использования фонового рисунка, не рисовать все в CanvasGadget?
Сделать CanvasGadget с размерами регулятора, нарисовать фон регулятора, а затем движок. Тогда все должно получится.
При таком подходе как сейчас, вообще теряется смысл использования канваса, поскольку не сможем получать координаты перемещения ползунка стандартными методами (с помощью #PB_EventType_MouseMove).
Почему бы в место использования фонового рисунка, не рисовать все в CanvasGadget?.
Я просто не знаю, как нарисовать все в CanvasGadget. Сейчас в нете поищу. Может у кого есть пример?
Может у кого есть пример?
Заодно сделал перемещение ползунка мышкой.
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
CatchImage(#Window_4, ?Window_4)
Procedure Draw(x, y)
StartDrawing(CanvasOutput(1))
DrawImage(ImageID(#Window_5), 0, 0)
DrawAlphaImage(ImageID(#Window_4), x, y)
StopDrawing()
EndProcedure
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(1, 20, 28, 80, 15)
Draw(20, 0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget()=1
Type = EventType()
If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(1, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
x=GetGadgetAttribute(1, #PB_Canvas_MouseX)-12
If x<0 : x=0 : EndIf
If x>80-24 : x = 80-24 : EndIf
Draw(x, 0)
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "H-knob3_Light.png"
Window_4:
IncludeBinary "H-knob3.png"
;}
EndDataSectionСпасибо.
Для нескольких попробовал сделать так:
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
CatchImage(#Window_4, ?Window_4)
Procedure Draw(x, y, Gadget)
StartDrawing(CanvasOutput(Gadget))
DrawImage(ImageID(#Window_5), 0, 0)
DrawAlphaImage(ImageID(#Window_4), x, y)
StopDrawing()
EndProcedure
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(1, 20, 28, 80, 15)
Draw(20, 0, 1)
CanvasGadget(2, 20, 58, 80, 15)
Draw(20, 0, 2)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget()=1
Type = EventType()
If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(1, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
x=GetGadgetAttribute(1, #PB_Canvas_MouseX)-12
If x<0 : x=0 : EndIf
If x>80-24 : x = 80-24 : EndIf
Draw(x, 0, 1)
EndIf
EndIf
If EventGadget()=2
Type = EventType()
If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(2, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
x=GetGadgetAttribute(2, #PB_Canvas_MouseX)-12
If x<0 : x=0 : EndIf
If x>80-24 : x = 80-24 : EndIf
Draw(x, 0, 2)
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "H-knob3_Light.png"
Window_4:
IncludeBinary "H-knob3.png"
;}
EndDataSectionПравильно? Проверил, работает. А как сделать вертикальные?
И еще: H-knob3_Light.png - это как бы подсветка при наведении курсора. Можно как-нибудь по другому сделать?
Для нескольких попробовал сделать так
Тогда уж лучше так - меньше кода.
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
CatchImage(#Window_4, ?Window_4)
Procedure Draw(x, y, Gadget)
StartDrawing(CanvasOutput(Gadget))
DrawImage(ImageID(#Window_5), 0, 0)
DrawAlphaImage(ImageID(#Window_4), x, y)
StopDrawing()
EndProcedure
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(1, 20, 28, 80, 15)
Draw(20, 0, 1)
CanvasGadget(2, 20, 58, 80, 15)
Draw(20, 0, 2)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Gadget=EventGadget()
If Gadget=1 Or Gadget=2
Type = EventType()
If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(Gadget, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
x=GetGadgetAttribute(Gadget, #PB_Canvas_MouseX)-12
If x<0 : x=0 : EndIf
If x>80-24 : x = 80-24 : EndIf
Draw(x, 0, Gadget)
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "H-knob3_Light.png"
Window_4:
IncludeBinary "H-knob3.png"
;}
EndDataSectionА как сделать вертикальные?
Примерно так же как и горизонтальные, только используем другие рисунки и работаем с координатой Y, а не X.
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
CatchImage(#Window_4, ?Window_4)
Procedure Draw(x, y)
StartDrawing(CanvasOutput(1))
DrawImage(ImageID(#Window_5), 0, 0)
DrawAlphaImage(ImageID(#Window_4), x, y)
StopDrawing()
EndProcedure
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(1, 20, 28, 15, 78)
Draw(0, 20)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
If EventGadget()=1
Type = EventType()
If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(1, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
y=GetGadgetAttribute(1, #PB_Canvas_MouseY)-12
If y<0 : y=0 : EndIf
If y>78-24 : y = 78-24 : EndIf
Draw(0, y)
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "V-knob3_Light.png"
Window_4:
IncludeBinary "V-knob3.png"
;}
EndDataSectionМожно как-нибудь по другому сделать?
Например, как хотелось бы?
Я лишь предложил один из простых вариантов.
Тогда уж лучше так, меньше кода.
Согласен.
только используем другие рисунки и работаем с координатой Y, а не X.
Спасибо.
И еще: H-knob3_Light.png - это как бы подсветка при наведении курсора. Можно как-нибудь по другому сделать?
Думаю чтобы это реализовать нужно вместо H-knob3_Light.png использоать рисунок фона. В нужном направлении думаю?
Мне понадобится одновременно шесть разных по цвету вертикальных движков. Думаю, что в Procedure Draw нужно менять ImageID в DrawAlphaImage(ImageID(#Window_4), x, y). Как это можно реализовать?
Думаю чтобы это реализовать нужно вместо H-knob3_Light.png использоать рисунок фона.
Выше уже делал так, результат видел? Фон регулятора нужно хранить в CanvasGadget, а не в виде фонового рисунка окна. Это вообще неправильно и подобных реализаций я даже не встречал.
Мне понадобится одновременно шесть разных по цвету вертикальных движков. Думаю, что в Procedure Draw нужно менять ImageID в DrawAlphaImage(ImageID(#Window_4), x, y). Как это можно реализовать?
Передавай в процедуру ID рисунка.
Procedure Draw(x, y, Gadget, ImageID) StartDrawing(CanvasOutput(Gadget)) DrawImage(ImageID(#Window_5), 0, 0) DrawAlphaImage(ImageID, x, y) StopDrawing() EndProcedure
Или можно создать массив с идентификаторами рисунков и в зависимости от идентификатора гаджета, использовать требуемый идентификатор рисунка, а можно его (ImageID) сохранить в ячейке Data, гаджета.
В общем, вариантов реализации может быть очень много.
Фон регулятора нужно хранить в CanvasGadget
Можно по подробней?
Можно по подробней?
Я же показывал пример. Вопросы новичка (продолжение…)
Там не только ползунок но и фон находятся в CanvasGadget.
То есть в Procedure Draw в сроке DrawImage(ImageID(#Window_5), 0, 0)? Понял, спасибо.
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
CatchImage(#Window_4, ?Window_4)
Procedure Draw(x, y, Gadget, ImageID)
StartDrawing(CanvasOutput(Gadget))
DrawImage(ImageID(#Window_5), 0, 0)
DrawAlphaImage(ImageID, x, y)
StopDrawing()
EndProcedure
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(1, 20, 28, 15, 78)
Draw(0, 20, 1, #Window_4)
CanvasGadget(2, 50, 28, 15, 78)
Draw(0, 20, 2, #Window_4)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Gadget=EventGadget()
If Gadget=1 Or Gadget=2
Type = EventType()
If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(Gadget, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
y=GetGadgetAttribute(Gadget, #PB_Canvas_MouseX)-12
If y<0 : y=0 : EndIf
If y>78-24 : y = 78-24 : EndIf
Draw(0, y, Gadget, ImageID)
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "V-knob3_Light.png"
Window_4:
IncludeBinary "V-knob3.png"
;}
EndDataSectionОшибка на DrawAlphaImage(ImageID, x, y): ImageID is null. Что не так?
Что не так?
Вот вызов процедуры.
Draw(0, y, Gadget, ImageID)
В ImageID что хранится?
В ImageID что хранится?
Согласен, что-то не пойму как там хранить ImageID.
Нужно передать идентификатор изображения.
Draw(0, y, Gadget, ImageID(#Window_4))
Ага, теперь выводится, только бегунок появляется только при нажатии на полосу.
Draw(0, y, Gadget, ImageID(#Window_4))
При таком вызове все бегунки одинаковые. Как тогда сюда загрузить разные ImageID?
только бегунок появляется только при нажатии на полосу.
CanvasGadget(1, 20, 28, 15, 78) Draw(0, 20, 1, ImageID(#Window_4)) CanvasGadget(2, 50, 28, 15, 78) Draw(0, 20, 2, ImageID(#Window_4))
Как тогда сюда загрузить разные ImageID?
Нужно указать требуемый идентификатор изображения при вызове процедуры Draw.
Это можно сделать на лету во время работы программы.
Допустим, у нас есть гаджеты с идентификаторами 1 - 4, создающие 4 бегунка. Так же есть изображения бегунков, допустим, тоже с идентификаторами 1 - 4.
Тогда все просто.
Draw(0, y, Gadget, ImageID(Gadget))
Enumeration
#Window_5
#Window_4
EndEnumeration
UsePNGImageDecoder()
CatchImage(#Window_5, ?Window_5)
CatchImage(#Window_4, ?Window_4)
Procedure Draw(x, y, Gadget, ImageID)
StartDrawing(CanvasOutput(Gadget))
DrawImage(ImageID(#Window_5), 0, 0)
DrawAlphaImage(ImageID, x, y)
StopDrawing()
EndProcedure
OpenWindow(0, 0, 0, 258, 123, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(1, 20, 28, 15, 78)
Draw(0, 20, 1, ImageID(#Window_4))
CanvasGadget(2, 50, 28, 15, 78)
Draw(0, 20, 2, ImageID(#Window_4))
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Gadget=EventGadget()
If Gadget=1 Or Gadget=2
Type = EventType()
If Type = #PB_EventType_LeftClick Or (Type = #PB_EventType_MouseMove And GetGadgetAttribute(Gadget, #PB_Canvas_Buttons) = #PB_Canvas_LeftButton)
y=GetGadgetAttribute(Gadget, #PB_Canvas_MouseY)-12
If y<0 : y=0 : EndIf
If y>78-24 : y = 78-24 : EndIf
Draw(0, y, Gadget, ImageID(Gadget))
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
DataSection
;{ ресурсы
Window_5:
IncludeBinary "V-knob3_Light.png"
Window_4:
IncludeBinary "V-knob3.png"
;}
EndDataSectionВыскакивает ошибка на строке Draw(0, y, Gadget, ImageID(Gadget)).
| Рисованный интерфейс 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 » Рисованный интерфейс программы