PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы


Рисованный интерфейс программы

Сообщений 91 страница 120 из 302

91

Пётр написал(а):

Можно ведь самому нарисовать - сделать из ImageGadget'а или CanvasGadget'а.

Можно поподробней или пример?

0

92

Определяем что была нажата левая кнопка мышки, или перемещена мышь и по текущим координатам курсора, передвигаем рисованный ползунок (картинку).

0

93

Понял, буду пробовать.

0

94

Можно пример работы CanvasGadget с загрузкой рисунка? За час сделал только это:
http://uploads.ru/t/v/2/x/v2xpK.png
Голова уже "кипит". o.O

0

95

Было бы проще если бы был не только скрин, но и код.

Если нужно поместить рисунок в произвольную часть, то так:

Код:
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

0

96

Вот код:

Код:
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

0

97

Выше уже написал как нужно сделать.

0

98

Это я понял. :)

0

99

Сделал так:

Код:
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

Рисунок выводится так:
http://uploads.ru/i/W/L/p/WLpPR.png
а должен быть просто бегунок. :dontknow:

0

100

Если нужно наложить рисунок с альфа каналом, то следует использовать функцию DrawAlphaImage().

0

101

Спасибо, завтра попробую.

0

102

Привет.
Сделал с 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

Рисунок теперь такой:
http://uploads.ru/i/G/J/M/GJMHz.png
С ImageGadget такого не было. Или я что-то не так делаю?

0

103

max написал(а):

Или я что-то не так делаю?

Канвас не поддерживает прозрачность, т.е. фон канваса всегда непрозрачен. Костыльный выход - это закрасить "H-knob3.png" вокруг ползунка, в цвет подложки.

0

104

Почему бы в место использования фонового рисунка, не рисовать все в CanvasGadget?
Сделать CanvasGadget с размерами регулятора, нарисовать фон регулятора, а затем движок. Тогда все должно получится.
При таком подходе как сейчас, вообще теряется смысл использования канваса, поскольку не сможем получать координаты перемещения ползунка стандартными методами (с помощью #PB_EventType_MouseMove).

0

105

Пётр написал(а):

Почему бы в место использования фонового рисунка, не рисовать все в CanvasGadget?.

Я просто не знаю, как нарисовать все в CanvasGadget. Сейчас в нете поищу. Может у кого есть пример?

0

106

max написал(а):

Может у кого есть пример?

Заодно сделал перемещение ползунка мышкой.

Код:
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

+1

107

Спасибо.
Для нескольких попробовал сделать так:

Код:
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 - это как бы подсветка при наведении курсора. Можно как-нибудь по другому сделать?

0

108

max написал(а):

Для нескольких попробовал сделать так

Тогда уж лучше так - меньше кода.

Код:
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
max написал(а):

А как сделать вертикальные?

Примерно так же как и горизонтальные, только используем другие рисунки и работаем с координатой 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
max написал(а):

Можно как-нибудь по другому сделать?

Например, как хотелось бы?
Я лишь предложил один из простых вариантов.

0

109

Пётр написал(а):

Тогда уж лучше так, меньше кода.

Согласен. :)

Пётр написал(а):

только используем другие рисунки и работаем с координатой Y, а не X.

Спасибо.

max написал(а):

И еще: H-knob3_Light.png - это как бы подсветка при наведении курсора. Можно как-нибудь по другому сделать?

Думаю чтобы это реализовать нужно вместо H-knob3_Light.png использоать рисунок фона. В нужном направлении думаю?
Мне понадобится одновременно шесть разных по цвету вертикальных движков. Думаю, что в Procedure Draw нужно менять ImageID в DrawAlphaImage(ImageID(#Window_4), x, y). Как это можно реализовать?

0

110

max написал(а):

Думаю чтобы это реализовать нужно вместо H-knob3_Light.png использоать рисунок фона.

Выше уже делал так, результат видел? Фон регулятора нужно хранить в CanvasGadget, а не в виде фонового рисунка окна. Это вообще неправильно и подобных реализаций я даже не встречал.

max написал(а):

Мне понадобится одновременно шесть разных по цвету вертикальных движков. Думаю, что в 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, гаджета.
В общем, вариантов реализации может быть очень много.

0

111

Пётр написал(а):

Фон регулятора нужно хранить в CanvasGadget

Можно по подробней?

0

112

max написал(а):

Можно по подробней?

Я же показывал пример. Вопросы новичка (продолжение…)
Там не только ползунок но и фон находятся в CanvasGadget.

0

113

То есть в Procedure Draw в сроке DrawImage(ImageID(#Window_5), 0, 0)? Понял, спасибо.

0

114

Код:
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. Что не так?

0

115

max написал(а):

Что не так?

Вот вызов процедуры.

Код:
Draw(0, y, Gadget, ImageID)

В ImageID что хранится?

0

116

Пётр написал(а):

В ImageID что хранится?

Согласен, что-то не пойму как там хранить ImageID.

0

117

Нужно передать идентификатор изображения.

Код:
Draw(0, y, Gadget, ImageID(#Window_4))

0

118

Ага, теперь выводится, только бегунок появляется только при нажатии на полосу.

Пётр написал(а):

Draw(0, y, Gadget, ImageID(#Window_4))

При таком вызове все бегунки одинаковые. Как тогда сюда загрузить разные ImageID?

0

119

max написал(а):

только бегунок появляется только при нажатии на полосу.

Код:
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))
max написал(а):

Как тогда сюда загрузить разные ImageID?

Нужно указать требуемый идентификатор изображения при вызове процедуры Draw.
Это можно сделать на лету во время работы программы.
Допустим, у нас есть гаджеты с идентификаторами 1 - 4, создающие 4 бегунка. Так же есть изображения бегунков, допустим, тоже с идентификаторами 1 - 4.
Тогда все просто.

Код:
Draw(0, y, Gadget, ImageID(Gadget))

0

120

Код:
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)).

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Рисованный интерфейс программы