PureBasic - форум

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

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


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


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

Сообщений 1 страница 30 из 302

1

Поддерживает ли пурик полупрозрачные текстуры? Можно пример?

Отредактировано max (19.04.2012 20:00:45)

0

2

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

Поддерживает ли пурик полупрозрачные текстуры? Можно пример?

Смотря что под этим подразумевается.
Была похожая тема. http://purebasic.info/phpBB2/viewtopic.php?t=2241

0

3

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

Смотря что под этим подразумевается.

Полупрозрачные картинки. Нужно при нажатии на кнопку изменить ее цвет.
Например так:
http://uploads.ru/i/K/k/q/Kkqzj.jpg
http://uploads.ru/i/2/6/Q/26QeE.jpg
Можно ли вращать изображение вокруг заданной точки?

Отредактировано max (19.04.2012 21:23:58)

0

4

Здесь можно использовать две картинки, заменяемые при нажатии кнопки мышки. Но лучше конечно три картинки, чтобы изменялась еще и при наведении.
Пример есть тут. http://purebasic.info/phpBB2/viewtopic. … 0415#30415
Ссылка для скачивания. http://purebasic.info/phpBB2/download.php?id=1154

Можно так же накладывать на основную картинку, другую полупрозрачную (реализуется через альфа-канал). http://purebasic.ru/manual.php?id=9&lng=rus

0

5

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

Можно ли вращать изображение вокруг заданной точки?

Можно. Где-то был пример, найти не могу.

0

6

Вот пример. http://pure-basic.narod.ru/forum/RotateImage.rar

0

7

Спасибо, вечером попробую.

0

8

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

Можно ли вращать изображение вокруг заданной точки?

Тут еще есть примеры. Поворот изображения

0

9

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

Вот пример. http://pure-basic.narod.ru/forum/RotateImage.rar

А можно сделать регулятор как в примере, только проще? Или может кто подскажет, как оттуда вытащить код регулятора?

0

10

Вроде как регулятор там отдельно в файле KnobSliderGadget.pb.

0

11

Ну да. Как сделать в одном файле?

0

12

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

Как сделать в одном файле?

Открыть файл, выделить код, скопировать и вставить в редактор.

0

13

Для этого проекта - логично. Мне понадобится 2-3 регулятора. Этот код, как я понял, для одного.

Отредактировано max (20.04.2012 21:11:28)

0

14

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

Пример есть тут. http://purebasic.info/phpBB2/viewtopic.php?p=30415
Ссылка для скачивания. http://purebasic.info/phpBB2/download.php?id=1154

В этих примерах изначально кнопка рисуется. Есть ли пример, где кнопка является фоном?

Отредактировано max (21.04.2012 13:01:36)

0

15

Фон тоже нужно рисовать, иначе откуда ему взяться. Или я что-то не так понял?

0

16

Фон загружаю так:

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

0

17

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

0

18

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

0

19

вот пример анимации кнопок на холсте:

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

0

20

Спасибо.

0

21

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

На нем уже есть кнопки. Так вот как на уже фоне отследить курсор над кнопкой?

Там отдельные картинки (ImageGadget'ы) и можно отследить курсор на них.

0

22

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

можно отследить курсор на них

Так и сделано. Теперь другая проблема: надо сделать, чтобы кноки 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

0

23

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

надо сделать, чтобы кнопки 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

0

24

Спасибо, что надо.

0

25

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

Спасибо, что надо.

Поторопился. Координаты накладываемых картинок не совпадают, где поправить, не нашел. Подсветка кнопок при нажатии кнопок проподает, повторное наведение не дает ни какого результата, пока не нажмешь ее. Добавил вывод сообщения при нажатии, после закрытия сообщения и перемещения курсора, оно(сообщение) снова выводится. Что делать, не знаю.

0

26

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

Координаты накладываемых картинок не совпадают, где поправить, не нашел.

Нужно правильно обрезать картинки чтобы все совпадало. Можно конечно изменять позиции ImageGadget'ов в окне, но все таки правильнее было бы, подогнать картинки друг к другу.

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

Подсветка кнопок при нажатии кнопок пропадает

Это в коде так прописано.
Просто не было все требуемых картинок. Нужен полный набор картинок.

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

Добавил вывод сообщения при нажатии, после закрытия сообщения и перемещения курсора, оно(сообщение) снова выводится. Что делать, не знаю.

Не видя кода сложно сказать что именно не так.

0

27

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

Не видя кода сложно сказать что именно не так.

Забыл. :blush:

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

Нужно правильно обрезать картинки чтобы все совпадало.

В коде есть координаты, все совпадает. Правильно - это как?

0

28

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

В коде есть координаты, все совпадает. Правильно - это как?

Есть смещение примерно на 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

+1

29

Теперь точно как надо. Что нужно изменить, чтобы можно было сделать кнопки не фиксируемые?

0

30

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

Что нужно изменить, чтобы можно было сделать кнопки не фиксируемые?

Убрать вызов макроса 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

0


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