Page 1 of 1

noob question about toolbarimagebutton

Posted: Wed Jun 15, 2005 5:31 pm
by BluesInA
i have a working toolbar image button doing what i want it to do. but can i change the image when a user clicks on the button? i'm using it to cycle through font sizes for text being displayed in string gadets. i have ico files i'd like to display on the toolbar image button for the different font sizes.

sorry if you don't understand my english - i went to school in california. :)

thanks for any help,

mike

Posted: Thu Jun 16, 2005 6:00 am
by dagcrack
Mike, something like this?

Code: Select all

Enumeration
  #hWnd
EndEnumeration
Enumeration
  #ButtonImage_0
  #ButtonImage_1
  #ButtonImage_2
  #Frame3D_0
EndEnumeration

SystemPath.s = Space(255) 
Result = GetSystemDirectory_(SystemPath.s, 255) 

Global Image0,Image1,Image2,Image3,Image4,Image5

Image0 =  ExtractIcon_(0, SystemPath + "\Shell32.dll", 10)
Image1 =  ExtractIcon_(0, SystemPath + "\Shell32.dll", 11)
Image2 =  ExtractIcon_(0, SystemPath + "\Shell32.dll", 21)
Image3 =  ExtractIcon_(0, SystemPath + "\Shell32.dll", 15)
Image4 =  ExtractIcon_(0, SystemPath + "\Shell32.dll", 18)
Image5 =  ExtractIcon_(0, SystemPath + "\Shell32.dll", 61)

Procedure Open_hWnd()
  If OpenWindow(#hWnd, 290, 255, 261, 106,  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Icon Example")
    If CreateGadgetList(WindowID())
      ButtonImageGadget(#ButtonImage_0, 30, 20, 60, 60, Image0)
      ButtonImageGadget(#ButtonImage_1, 100, 20, 60, 60, Image1)
      ButtonImageGadget(#ButtonImage_2, 170, 20, 60, 60, Image2)
      Frame3DGadget(#Frame3D_0, 10, 10, 240, 80, "")
      
    EndIf
  EndIf
EndProcedure

Open_hWnd()
Repeat
  
  Event = WaitWindowEvent()
  
  If Event = #PB_EventGadget
    
    GadgetID = EventGadgetID()
    
    If GadgetID = #ButtonImage_0 
      ; we will change it only once..
      SetGadgetState(#ButtonImage_0,Image3)
      
    ElseIf GadgetID = #ButtonImage_1
      ; we will change it on every click from one to the other
      
      enable=1-enable 
      If enable = 1
        SetGadgetState(#ButtonImage_1,Image4)
      Else
        SetGadgetState(#ButtonImage_1,Image1)
      EndIf
      
      
    ElseIf GadgetID = #ButtonImage_2
      ; we will loop through some of the icons
      ; the lazy-guy way :)
      
      Img + 1

      If Img = 1
        SetGadgetState(#ButtonImage_2,Image0)
      ElseIf Img = 2
        SetGadgetState(#ButtonImage_2,Image1)
      ElseIf Img = 3
        SetGadgetState(#ButtonImage_2,Image2)
      ElseIf Img = 4 
        SetGadgetState(#ButtonImage_2,Image3)
      ElseIf Img > 4 
        SetGadgetState(#ButtonImage_2,Image4)
        Img = 0
      EndIf
      
    EndIf
    
  EndIf
Until Event = #PB_EventCloseWindow
End

;change icons example by gushh...
Its pretty simple but it might be what you want to do?

Posted: Thu Jun 16, 2005 8:38 am
by Jan2004
Could you exactly comment this part of source code (particulary SystemPath):

Code: Select all

SystemPath.s = Space(255) 
Result = GetSystemDirectory_(SystemPath.s, 255) 


Image0 =  ExtractIcon_(0, SystemPath + "\Shell32.dll", 10) 

Posted: Thu Jun 16, 2005 12:25 pm
by dagcrack
Yes I could, however I dont save lines just because somethings supported or not. In a project im working on, I dont even use systempath, you're right. But its quite lazy not to use it. as you might need the systempath later (not in this case). But this is an old code of mine which I slapped the dust and posted.

Code: Select all

Image0 =  ExtractIcon_(0, "Shell32.dll", 10)
that is "good" to work indeed, however I already told you I like to do things even if it makes you write more.

Posted: Thu Jun 16, 2005 1:44 pm
by Dare2
Hi Jan2004,

Did you mean comment out (as in remove) or comment on (as in explain)?

Posted: Thu Jun 16, 2005 2:57 pm
by BluesInA
all,

thanks for your replies. your example, dagcrack, does just what i want, but when i get the button into the toolbar, the button won't respond to mouse clicks. i tried using a spin gadget but the same thing happened. this is how i got the gadget into the toolbar (code from the forum):

hToolBar = CreateToolBar(#ToolBar, WindowID(#Window_Main))
If hToolBar
ToolBarStandardButton(#ToolBar_New, #PB_ToolBarIcon_New)
.
.
.
If CreateGadgetList(WindowID(#Window_Main))
hComboBox1 = ComboBoxGadget(#Gadget_ComboBox_1,180,0,250,100,#PB_ComboBox_editable)
SetParent_(hComboBox1, hToolBar)


the combobox seems to work ok, but when i try other gadgets, they just sit there and do nothing.

anyway, thanks again,
mike

Posted: Thu Jun 16, 2005 3:00 pm
by dagcrack
Mike, maybe it has something to do with the gadget list... sometimes if you create wrongly your gadgets, they might be unusable.. But this is just a thought of what could be happening, you should post a code that resembles this problem you have, so we can check it out and find a solution.

Posted: Thu Jun 16, 2005 6:54 pm
by BluesInA
hey, cool, i got the buttons to work. i included a spin gadget in my example to show you what i was talking about - i still can't get it to work. but now that i can get the buttons to work, i'm just curious about the spin gadget.

thanks a lot,

mike




Enumeration
#Window_0
#ToolBarStandard_1
#ToolBarStandard_2
#ToolBarStandard_3
#ToolBarImage_1
#ButtonImage_0
#SpinGadget_0
EndEnumeration

Procedure Open_Window_0()
If OpenWindow(#Window_0, 216, 0, 150, 100, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar , "ToolBar Test")
toolbar = CreateToolBar(0, WindowID(#Window_0))
If toolbar
ToolBarStandardButton(#ToolBarStandard_1, #PB_ToolBarIcon_New)
ToolBarStandardButton(#ToolBarStandard_2, #PB_ToolBarIcon_Open)
ToolBarStandardButton(#ToolBarStandard_3, #PB_ToolBarIcon_Save)
CreateImage(tbImage1,16,16)
LoadImage(tbImage1, "C:\Program Files\PureBasic\Examples\Sources\Data\Drive.bmp")
ToolBarImageButton(#ToolBarImage_1, UseImage(tbImage1)) ; can i change this image when user clicks?
EndIf

If CreateGadgetList(WindowID())
img = LoadImage(tbImage2, "C:\Program Files\PureBasic\Examples\Sources\Data\File.bmp")
button = ButtonImageGadget(#ButtonImage_0, 95, 0, 18, 18, img)
SetParent_(button, toolbar)
spin = SpinGadget(#SpinGadget_0, 120, 0, 30, 20, 5, 15)
SetGadgetState (#SpinGadget_0,5) : SetGadgetText(#SpinGadget_0,"5")
SetParent_(spin, toolbar)
EndIf
EndIf
EndProcedure

swap = 1

Open_Window_0()

Repeat
Event = WaitWindowEvent()
Select Event
; Case #PB_Event_Menu
; Select EventMenuID()
; Case #ToolBarStandard_1
; Case #ToolBarStandard_2
; Case #ToolBarStandard_3
; Case #ToolBarImage_1
; EndSelect

Case #PB_Event_Gadget
Select EventGadgetID()
Case #ButtonImage_0
If swap
img = LoadImage(tbImage2, "C:\Program Files\PureBasic\Examples\Sources\Data\Drive.bmp")
SetGadgetState(#ButtonImage_0, img)
swap = 0
Else
img = LoadImage(tbImage2, "C:\Program Files\PureBasic\Examples\Sources\Data\CDPlayer.ico")
SetGadgetState(#ButtonImage_0, img)
swap = 1
EndIf

Case #SpinGadget_0
SetGadgetText(#SpinGadget_0,Str(GetGadgetState(#SpinGadget_0))) ; doesn't spin
;WindowEvent() ; absolutely needed to avoid endless event-loops

EndSelect
EndSelect
Until Event = #PB_EventCloseWindow
End

Posted: Sat Jun 18, 2005 12:12 am
by Sparkie
The SpinGadget is actually 2 gadgets. A "buddy" gadget (the Edit control/StringGadget) and the the "spinner" (those little up/down buttons).

Code: Select all

spin = SpinGadget(#SpinGadget_0, 120, 0, 30, 20, 5, 15)
^That^ code was returning the handle to the "buddy" portion of the SpinGadget.

Code: Select all

SetParent_(spin, toolbar)
^That^ code was setting the parent for the "buddy" portion of the SpinGadget, and leaving the "spinner" behind. You need to set the parent for the "spinner" and the "buddy", individually. ;)

Here's a working SpinGadget with ToolBar as parent. Take a look at lines 27 - 33 for comments.

Code: Select all

Enumeration 
  #Window_0 
  #ToolBarStandard_1 
  #ToolBarStandard_2 
  #ToolBarStandard_3 
  #ToolBarImage_1 
  #ButtonImage_0 
  #SpinGadget_0 
EndEnumeration 

Procedure Open_Window_0() 
  If OpenWindow(#Window_0, 216, 0, 150, 100, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar , "ToolBar Test") 
    toolbar = CreateToolBar(0, WindowID(#Window_0)) 
    If toolbar 
      ToolBarStandardButton(#ToolBarStandard_1, #PB_ToolBarIcon_New) 
      ToolBarStandardButton(#ToolBarStandard_2, #PB_ToolBarIcon_Open) 
      ToolBarStandardButton(#ToolBarStandard_3, #PB_ToolBarIcon_Save) 
      CreateImage(tbImage1,16,16) 
      LoadImage(tbImage1, "C:\PureBasic\Examples\Sources\Data\Drive.bmp") 
      ToolBarImageButton(#ToolBarImage_1, UseImage(tbImage1)) ; can i change this image when user clicks? 
    EndIf 
    
    If CreateGadgetList(WindowID()) 
      img = LoadImage(tbImage2, "C:\PureBasic\Examples\Sources\Data\File.bmp") 
      button = ButtonImageGadget(#ButtonImage_0, 95, 0, 18, 18, img) 
      SetParent_(button, toolbar) 
      ; --> SpinGadget returns a handle to the "buddy" (Edit control/StringGadget)
      spinBuddy = SpinGadget(#SpinGadget_0, 120, 0, 30, 20, 5, 15)
      ; --> Find the "spinner" (up/down buttons)
      spinner = FindWindowEx_(WindowID(), spinBuddy, "msctls_updown32", #Null)
      ; --> Set parent for "buddy" and "spinner"
      SetParent_(spinBuddy, toolbar) 
      SetParent_(spinner, toolbar) 
      SetGadgetState (#SpinGadget_0,5) : SetGadgetText(#SpinGadget_0,"5") 
    EndIf 
  EndIf 
EndProcedure 

swap = 1 

Open_Window_0() 

Repeat 
  event = WaitWindowEvent() 
  Select event 
    Case #PB_Event_Gadget 
      Select EventGadgetID() 
        Case #ButtonImage_0 
          If swap 
            img = LoadImage(tbImage2, "C:\PureBasic\Examples\Sources\Data\Drive.bmp") 
            SetGadgetState(#ButtonImage_0, img) 
            swap = 0 
          Else 
            img = LoadImage(tbImage2, "C:\PureBasic\Examples\Sources\Data\CDPlayer.ico") 
            SetGadgetState(#ButtonImage_0, img) 
            swap = 1 
          EndIf 
          
        Case #SpinGadget_0 
          SetGadgetText(#SpinGadget_0,Str(GetGadgetState(#SpinGadget_0))) ; doesn't spin 
                    
      EndSelect 
  EndSelect 
Until event = #PB_EventCloseWindow 
End
As a side note, you should use code tags when posting code snippets. It makes for easier reading and it helps with copy/paste operations. ;)

Posted: Sat Jun 18, 2005 4:06 pm
by BluesInA
thanks for your reply sparkie. that was a great explanation, especially for a noob like me. and i'll use the code tag next time.

mike

Posted: Sat Jun 18, 2005 4:55 pm
by Sparkie
You're welcome mike. :)