Arrows to select buttons and "Enter" (?)

Just starting out? Need help? Post your questions and find answers here.
AZJIO
Addict
Addict
Posts: 2140
Joined: Sun May 14, 2017 1:48 am

Arrows to select buttons and "Enter" (?)

Post by AZJIO »

I want to move the button selection and press "Enter" to simulate pressing the button.
It's not working now.

Code: Select all

EnableExplicit


Enumeration #PB_Event_FirstCustomValue
	#EvenementDebutAction
	#Event1
	#Event2
EndEnumeration

#Window = 0
#Menu = 0
Define hMenu, mNext, mPrev, mEnter, hbtn, tmp, i

If OpenWindow(#Window, 0, 0, 220, 150, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	ButtonGadget (0, 10, 10, 200, 30, "Button1", #PB_Button_Default)
	ButtonGadget (1, 10, 50, 200, 30, "Button2")
	ButtonGadget (2, 10, 90, 200, 30, "Button3")

	hMenu = CreatePopupMenu(#Menu)

	mNext = 0
	mPrev = 1
	mEnter = 2
	If hMenu
		MenuItem(mNext, "Next" + #TAB$ + "->")
		AddKeyboardShortcut(#Window, #PB_Shortcut_Right, mNext)
		AddKeyboardShortcut(#Window, #PB_Shortcut_Down, mNext)
		MenuItem(mPrev, "Prev" + #TAB$ + "<-")
		AddKeyboardShortcut(#Window, #PB_Shortcut_Left, mPrev)
		AddKeyboardShortcut(#Window, #PB_Shortcut_Up, mPrev)
		MenuItem(mEnter, "Enter" + #TAB$ + "Enter")
		AddKeyboardShortcut(#Window, #PB_Shortcut_Return, mEnter)
	EndIf
	
	
	Repeat
		Select WaitWindowEvent()
			Case #PB_Event_RightClick
				DisplayPopupMenu(#Menu, WindowID(#Window))
            Case #PB_Event_Menu
                Select EventMenu()
					Case mNext
						For i = 0 To 2
							hbtn = GadgetID(i)
							tmp = GetWindowLongPtr_(hbtn, #GWL_STYLE)
							If tmp & #BS_DEFPUSHBUTTON
; 								MessageRequester("id=" + Str(i), "hbtn=" + Str(hbtn) + ", tmp=" + Str(tmp)+ ", tmp2=" + Str(tmp ! #BS_DEFPUSHBUTTON))
								SetWindowLongPtr_(hbtn, #GWL_STYLE, tmp ! #BS_DEFPUSHBUTTON)
								If i+1 > 2
									i = -1
								EndIf
								SetWindowLongPtr_(GadgetID(i+1), #GWL_STYLE, tmp)
								Break
							EndIf
						Next
					Case mPrev
						For i = 0 To 2
							hbtn = GadgetID(i)
							tmp = GetWindowLongPtr_(hbtn, #GWL_STYLE)
							If tmp & #BS_DEFPUSHBUTTON
; 								MessageRequester("id=" + Str(i), "hbtn=" + Str(hbtn) + ", tmp=" + Str(tmp)+ ", tmp2=" + Str(tmp ! #BS_DEFPUSHBUTTON))
								SetWindowLongPtr_(hbtn, #GWL_STYLE, tmp ! #BS_DEFPUSHBUTTON)
								If i-1 < 0
									i = 3
								EndIf
								SetWindowLongPtr_(GadgetID(i-1), #GWL_STYLE, tmp)
								Break
							EndIf
						Next
					Case mEnter
						For i = 0 To 2
							hbtn = GadgetID(i)
							If GetWindowLongPtr_(hbtn, #GWL_STYLE) & #BS_DEFPUSHBUTTON
								; 								???
								PostEvent(#EvenementDebutAction + i, 0, 1, #PB_EventType_FirstCustomValue, 10)
								Break
							EndIf
						Next
				EndSelect
			Case #PB_Event_Gadget
				Select EventGadget()
					Case 0, #EvenementDebutAction
						MessageRequester("", "1")
					Case 1, #Event1
						MessageRequester("", "2")
					Case 2, #Event2
						MessageRequester("", "3")
				EndSelect
			Case #PB_Event_CloseWindow
				CloseWindow(#Window)
				End
		EndSelect
	ForEver
EndIf
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4938
Joined: Sun Apr 12, 2009 6:27 am

Re: Arrows to select buttons and "Enter" (?)

Post by RASHAD »

Workaround

Code: Select all

OpenWindow(0, 0, 0, 120, 120, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ButtonGadget(0, 10, 10, 100, 25, "# 0")
ButtonGadget(1, 10, 40, 100, 25, "# 1")
ButtonGadget(2, 10, 70, 100, 25, "# 2")
SendMessage_(WindowID(0),#WM_UPDATEUISTATE,$30002,0)
SetActiveGadget(0)
; PostMessage_(GadgetID(0), #WM_LBUTTONDOWN, 0, 0)
; PostMessage_(GadgetID(0), #WM_LBUTTONUP, 0, 0)  

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Quit = 1
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0,1,2
          Select EventType()               
            Case #PB_EventType_LeftClick
              Debug "Button : "+ Str(act) + " Clicked"
          EndSelect
      EndSelect
      
    Case #WM_KEYDOWN
      Select EventwParam()
        Case 38
          act = GetActiveGadget()
          If act = 0
            act = 3
          EndIf
          SetActiveGadget(act-1)
          
        Case 40
          act = GetActiveGadget()
          If act = 2
            act = -1
          EndIf
          SetActiveGadget(act+1)
      EndSelect
      
    Case #WM_CHAR
      Select EventwParam()
        Case 13
          act = GetActiveGadget()
          PostMessage_(GadgetID(act), #WM_LBUTTONDOWN, 0, 0)
          PostMessage_(GadgetID(act), #WM_LBUTTONUP, 0, 0)          
      EndSelect
      
  EndSelect
Until Quit = 1

Edit : Bug fixed
Last edited by RASHAD on Thu Jan 06, 2022 1:41 am, edited 2 times in total.
Egypt my love
User avatar
ChrisR
Addict
Addict
Posts: 1466
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: Arrows to select buttons and "Enter" (?)

Post by ChrisR »

Edit: Oups, I did not see or look at Rashad's answer.

Or You can do it with something like this

Code: Select all

EnableExplicit

#Window = 0
#Menu = 0

Import ""
  PB_Gadget_SendGadgetCommand(hWnd, EventType)
EndImport

Define hMenu, mNext, mPrev, mEnter, hbtn, tmp, ActiveGadget, i

If OpenWindow(#Window, 0, 0, 220, 150, "Пример...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget (0, 10, 10, 200, 30, "Button1", #PB_Button_Toggle) : SetGadgetState(0, #True)
  ButtonGadget (1, 10, 50, 200, 30, "Button2", #PB_Button_Toggle)
  ButtonGadget (2, 10, 90, 200, 30, "Button3", #PB_Button_Toggle)
  
  hMenu = CreatePopupMenu(#Menu)
  
  mNext = 0
  mPrev = 1
  mEnter = 2
  If hMenu
    MenuItem(mNext, "Next" + #TAB$ + "->")
    AddKeyboardShortcut(#Window, #PB_Shortcut_Right, mNext)
    AddKeyboardShortcut(#Window, #PB_Shortcut_Down, mNext)
    MenuItem(mPrev, "Prev" + #TAB$ + "<-")
    AddKeyboardShortcut(#Window, #PB_Shortcut_Left, mPrev)
    AddKeyboardShortcut(#Window, #PB_Shortcut_Up, mPrev)
    MenuItem(mEnter, "Enter" + #TAB$ + "Enter")
    AddKeyboardShortcut(#Window, #PB_Shortcut_Return, mEnter)
  EndIf
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_RightClick
        DisplayPopupMenu(#Menu, WindowID(#Window))
      Case #PB_Event_Menu
        Select EventMenu()
          Case mNext
            For i = 0 To 2
              If GetGadgetState(i)
                If i = 2
                  ActiveGadget = 0
                Else
                  ActiveGadget = i + 1
                EndIf
                Break
              EndIf
            Next
            PB_Gadget_SendGadgetCommand(GadgetID(ActiveGadget), #PB_EventType_LeftClick)
          Case mPrev
            For i = 0 To 2
              If GetGadgetState(i)
                If i = 0
                  ActiveGadget = 2
                Else
                  ActiveGadget = i - 1
                EndIf
                Break
              EndIf
            Next
            PB_Gadget_SendGadgetCommand(GadgetID(ActiveGadget), #PB_EventType_LeftClick)
          Case mEnter
            For i = 0 To 2
              If GetGadgetState(i)
                ActiveGadget = i
                Break
              EndIf
            Next
            PB_Gadget_SendGadgetCommand(GadgetID(ActiveGadget), #PB_EventType_LeftClick)
        EndSelect
        
      Case #PB_Event_Gadget
        For i = 0 To 2
          If EventGadget() = i
            SetGadgetState(i, #True)
            SetActiveGadget(i)
          Else
            SetGadgetState(i, #False)
          EndIf
        Next
        Debug GetGadgetText(EventGadget()) + " Clicked"
        ;MessageRequester("", GetGadgetText(EventGadget()) + " Clicked")
        
      Case #PB_Event_CloseWindow
        CloseWindow(#Window)
        End
    EndSelect
  ForEver
EndIf
User avatar
mk-soft
Always Here
Always Here
Posts: 6200
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Arrows to select buttons and "Enter" (?)

Post by mk-soft »

Code: Select all

Import ""
  PB_Gadget_SendGadgetCommand(hWnd, EventType)
EndImport
I don't know which version you are working with. v3.9 ?

But there is a function called PostEvent :wink:
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
ChrisR
Addict
Addict
Posts: 1466
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: Arrows to select buttons and "Enter" (?)

Post by ChrisR »

5.73 or 6.00. PB_Gadget_SendGadgetCommand internal function remains available and functional.
Is it here in Gadget.lib just for backwards compatibility ? Is it better not to use it and to use the classic PostEvent ?
Mesa
Enthusiast
Enthusiast
Posts: 433
Joined: Fri Feb 24, 2012 10:19 am

Re: Arrows to select buttons and "Enter" (?)

Post by Mesa »

Should be multiplatform and pb only:

Code: Select all

#Window=0
#Menu = 0

OpenWindow(#Window, 0, 0, 120, 120, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ButtonGadget(0, 10, 10, 100, 25, "# 0")
ButtonGadget(1, 10, 40, 100, 25, "# 1")
ButtonGadget(2, 10, 70, 100, 25, "# 2")

Global btnactive=0
SetActiveGadget(btnactive)


hMenu = CreatePopupMenu(#Menu)

mNext = 0
mPrev = 1
mEnter = 2
If hMenu
	MenuItem(mNext, "Next" + #TAB$ + "->")
	AddKeyboardShortcut(#Window, #PB_Shortcut_Right, mNext)
	AddKeyboardShortcut(#Window, #PB_Shortcut_Down, mNext)
	MenuItem(mPrev, "Prev" + #TAB$ + "<-")
	AddKeyboardShortcut(#Window, #PB_Shortcut_Left, mPrev)
	AddKeyboardShortcut(#Window, #PB_Shortcut_Up, mPrev)
	MenuItem(mEnter, "Enter" + #TAB$ + "Enter")
	AddKeyboardShortcut(#Window, #PB_Shortcut_Return, mEnter)
EndIf

Repeat
	Event = WaitWindowEvent()
	EvGadget = EventGadget()
	EvType = EventType()
	EvMenu = EventMenu()
	
	Select Event
		Case #PB_Event_CloseWindow
			Quit = 1
			
		Case #PB_Event_RightClick
			DisplayPopupMenu(#Menu, WindowID(#Window))	
			
		Case #PB_Event_Menu            
			Select EvMenu  ; To see which menu has been selected
					
				Case 0 ; mNext
					Debug "next"
					btnactive = GetActiveGadget() ;tab + shift tab effect
					btnactive=btnactive+1
					If btnactive>2
						btnactive=0
					EndIf
					Debug "button " + btnactive
					SetActiveGadget(btnactive)
					
				Case 1 ; mPrev 
					Debug "prev"
					btnactive = GetActiveGadget() ;tab + shift tab effect
					btnactive=btnactive-1
					If btnactive<0
						btnactive=2
					EndIf
					Debug "button " + btnactive
					SetActiveGadget(btnactive)
					
				Case 2	;mEnter
					Debug "enter"
					btnactive = GetActiveGadget() ;tab + shift tab effect
					PostEvent(#PB_Event_Gadget, #Window, btnactive)        
			EndSelect
			
			
			
		Case #PB_Event_Gadget
			Select EvGadget
				Case 0
					Select EvType               
						Case #PB_EventType_LeftClick
							Debug "Button 0 Clicked"
					EndSelect
					
				Case 1
					Select EvType               
						Case #PB_EventType_LeftClick
							Debug "Button 1 Clicked"
					EndSelect
					
				Case 2
					Select EvType               
						Case #PB_EventType_LeftClick
							Debug "Button 2 Clicked"
					EndSelect
			EndSelect
			
			
			
	EndSelect
Until Quit = 1

M.
Last edited by Mesa on Fri Jan 07, 2022 10:50 am, edited 2 times in total.
User avatar
ChrisR
Addict
Addict
Posts: 1466
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: Arrows to select buttons and "Enter" (?)

Post by ChrisR »

More or less the same thing, without the 'Toggle' button, but cleaner :)
However, can I have an explanation, I don't know the history even less v3.9 :lol:, on PB_Gadget_SendGadgetCommand() vs PostEvent() ?
User avatar
mk-soft
Always Here
Always Here
Posts: 6200
Joined: Fri May 12, 2006 6:51 pm
Location: Germany

Re: Arrows to select buttons and "Enter" (?)

Post by mk-soft »

ChrisR wrote: Thu Jan 06, 2022 11:46 am More or less the same thing, without the 'Toggle' button, but cleaner :)
However, can I have an explanation, I don't know the history even less v3.9 :lol:, on PB_Gadget_SendGadgetCommand() vs PostEvent() ?
At the request of the user, the internal function 'PB_Gadget_SendGadgetCommand()' was added at some point as a standard function as a PostEvent.
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
User avatar
ChrisR
Addict
Addict
Posts: 1466
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: Arrows to select buttons and "Enter" (?)

Post by ChrisR »

Thank you for your answer, after all PostEvent is in the help and more complete, the other function is no longer documented.
So agree, better to use PostEvent as Mesa did.
AZJIO
Addict
Addict
Posts: 2140
Joined: Sun May 14, 2017 1:48 am

Re: Arrows to select buttons and "Enter" (?)

Post by AZJIO »

If you add btnactive = GetActiveGadget() at the beginning of the mNext and mPrev events, then the counter is synchronized with the mixed tab and shift+tab selection.

Thanks for the examples, I added to my launcher.
Mesa
Enthusiast
Enthusiast
Posts: 433
Joined: Fri Feb 24, 2012 10:19 am

Re: Arrows to select buttons and "Enter" (?)

Post by Mesa »

cool, :D

code updated.

M.
AZJIO
Addict
Addict
Posts: 2140
Joined: Sun May 14, 2017 1:48 am

Re: Arrows to select buttons and "Enter" (?)

Post by AZJIO »

Orange border around the active gadget

Code: Select all

#Window=0
#Menu = 0

Global Cnv1 = 6
Global Cnv2 = 7
Global Cnv3 = 8
Global Cnv4 = 9
Global border_width = 3

Procedure MoveFrame(d)
	Protected x, y, w, h
	x = GadgetX(d)
	y = GadgetY(d)
	w = GadgetWidth(d)
	h = GadgetHeight(d)
	
	ResizeGadget(Cnv1, x-border_width, y, #PB_Ignore, h) ; vertical, left
	ResizeGadget(Cnv2,  x-border_width, y-border_width, w+border_width*2, #PB_Ignore) ; horizontal, top
	ResizeGadget(Cnv3, x+w, y, #PB_Ignore, h)										  ; vertical, right
	ResizeGadget(Cnv4, x-border_width, y+h, w+border_width*2, #PB_Ignore)			  ; horizontal, bottom
EndProcedure

Procedure SetActiveButton(g)
	While Not IsGadget(g) Or g < 0
		g - 1
	Wend
	If IsGadget(g)
		SetActiveGadget(g)
		MoveFrame(g)
	EndIf
EndProcedure

OpenWindow(#Window, 0, 0, 230, 120, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ButtonGadget(0, 10, 10, 100, 25, "# 0")
ButtonGadget(1, 10, 40, 100, 25, "# 1")
ButtonGadget(2, 10, 70, 100, 25, "# 2")
ButtonGadget(3, 120, 10, 100, 25, "# 3")
ButtonGadget(4, 120, 40, 100, 25, "# 4")
ButtonGadget(5, 120, 70, 100, 25, "# 5")

Global btnactive=0
SetActiveGadget(btnactive)


hMenu = CreatePopupMenu(#Menu)

mNext = 0
mPrev = 1
mEnter = 2
mRight = 3
mLeft = 4
If hMenu
	MenuItem(mNext, "Next" + #TAB$ + "->")
	AddKeyboardShortcut(#Window, #PB_Shortcut_Down, mNext)
	MenuItem(mPrev, "Prev" + #TAB$ + "<-")
	AddKeyboardShortcut(#Window, #PB_Shortcut_Up, mPrev)
	MenuItem(mEnter, "Enter" + #TAB$ + "Enter")
	AddKeyboardShortcut(#Window, #PB_Shortcut_Return, mEnter)
	MenuItem(mPrev, "Left" + #TAB$ + "<-")
	AddKeyboardShortcut(#Window, #PB_Shortcut_Left, mLeft)
	MenuItem(mNext, "Right" + #TAB$ + "->")
	AddKeyboardShortcut(#Window, #PB_Shortcut_Right, mRight)
EndIf

Define i
Define x = GadgetX(0)
Define y = GadgetY(0)
Define w = GadgetWidth(0)
Define h = GadgetHeight(0)
CanvasGadget(Cnv1, x-border_width, y, border_width, h) ; vertical, left
CanvasGadget(Cnv2, x-border_width, y-border_width, w+border_width*2, border_width) ; horizontal, top
CanvasGadget(Cnv3, x+w, y, border_width, h)										   ; vertical, right
CanvasGadget(Cnv4, x-border_width, y+h, w+border_width*2, border_width)			   ; horizontal, bottom
For i=Cnv1 To Cnv4
	If StartDrawing(CanvasOutput(i))
		FillArea(0, 0, -1, $0088FF) 
		StopDrawing()
	EndIf
Next

Repeat
	Event = WaitWindowEvent()
	EvGadget = EventGadget()
	EvType = EventType()
	EvMenu = EventMenu()
	
	Select Event
		Case #PB_Event_CloseWindow
			Quit = 1
			
		Case #PB_Event_RightClick
			DisplayPopupMenu(#Menu, WindowID(#Window))	
			
		Case #PB_Event_Menu            
			Select EvMenu  ; To see which menu has been selected
					
				Case 0 ; mNext
					Debug "next"
					btnactive = GetActiveGadget() ;tab + shift tab effect
					btnactive=btnactive+1
					If btnactive>5
						btnactive=0
					EndIf
					Debug "button " + btnactive
					SetActiveButton(btnactive)
					
				Case 1 ; mPrev 
					Debug "prev"
					btnactive = GetActiveGadget() ;tab + shift tab effect
					btnactive=btnactive-1
					If btnactive<0
						btnactive=5
					EndIf
					Debug "button " + btnactive
					SetActiveButton(btnactive)
					
				Case 2	;mEnter
					Debug "enter"
					btnactive = GetActiveGadget() ;tab + shift tab effect
					PostEvent(#PB_Event_Gadget, #Window, btnactive)      
					
				Case 3 ; mRight
					btnactive = GetActiveGadget()
					btnactive + 3 ; rows
					If btnactive > 5
						btnactive = 5
					EndIf
					SetActiveButton(btnactive)
					
				Case 4 ; mLeft
					btnactive = GetActiveGadget()
					btnactive - 3 ; rows
					If btnactive < 0
						btnactive = 0
					EndIf
					SetActiveButton(btnactive)  
			EndSelect
			
		Case #PB_Event_Gadget
			Select EvGadget
				Case 0
					Select EvType               
						Case #PB_EventType_LeftClick
							Debug "Button 0 Clicked"
					EndSelect
					
				Case 1
					Select EvType               
						Case #PB_EventType_LeftClick
							Debug "Button 1 Clicked"
					EndSelect
					
				Case 2
					Select EvType               
						Case #PB_EventType_LeftClick
							Debug "Button 2 Clicked"
					EndSelect
			EndSelect
			
	EndSelect
Until Quit = 1
AZJIO
Addict
Addict
Posts: 2140
Joined: Sun May 14, 2017 1:48 am

Re: Arrows to select buttons and "Enter" (?)

Post by AZJIO »

I made an example, now I want to draw a frame and move it

Code: Select all

EnableExplicit

Global hDC, MemDC, hOldBMP
Global flgMemDC = 1
Global hGUI, hBtn
Global rc.RECT

Procedure WinCallback(hWnd, uMsg, WParam, LParam)
	Protected hBrush, MemBMP, thick = 3, Rect.RECT
	If uMsg = #WM_PAINT
		If flgMemDC
			flgMemDC = 0
			
			Rect\left = 0
			Rect\right = 204
			Rect\top = 0
			Rect\bottom = 34
			
			MemBMP = CreateCompatibleBitmap_(hDC, 204, 34)
			hOldBMP = SelectObject_(MemDC, MemBMP)
			hBrush = CreateSolidBrush_($ff8800)
			SelectObject_(MemDC, hBrush)
			FillRect_(MemDC, Rect, hBrush) ; fill in the rectangle of the window in memory
			DeleteObject_(hBrush)
			DeleteObject_(MemBMP)
		EndIf
		BitBlt_(hDC, 8, 58, 203, thick, MemDC, 0, 0, $00CC0020) ; top
		BitBlt_(hDC, 11, 91, 203, thick, MemDC, 0, 0, $00CC0020); bottom
		BitBlt_(hDC, 8, 61, thick, 33, MemDC, 0, 0, $00CC0020)	; left
		BitBlt_(hDC, 211, 58, thick, 33, MemDC, 0, 0, $00CC0020); right
	EndIf
	
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

hGUI = OpenWindow(0, 0, 0, 240, 120, "Example...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
hBtn = ButtonGadget (1, 11, 61, 200, 30, "Button")

hDC = GetDC_(hGUI)
MemDC = CreateCompatibleDC_(hDC)

SetWindowCallback(@WinCallback())

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_Gadget
			Select EventGadget()
				Case 1
			EndSelect
		Case #PB_Event_CloseWindow
			ReleaseDC_(hGUI, hDC)
			SelectObject_(MemDC, hOldBMP)
			DeleteDC_(MemDC)
			CloseWindow(0)
			End
	EndSelect
ForEver
Post Reply