Customize the ShortcutGadget

Share your advanced PureBasic knowledge/code with the community.
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8451
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Customize the ShortcutGadget

Post by netmaestro »

Code: Select all

;=================================================================
; Library Command:      ShortcutGadgetEx()
; Author:               Lloyd Gallant (netmaestro)
; Date:                 January 3, 2010
; Target Compiler:      PureBasic 4.40
; Target OS             Windows only
; License:              Free, unrestricted, no warranty
;
; What it does:         Adds Backspace key and maps numpad
;                       keys to corresponding extended keys
;                       affecting arrow keys, Page keys,
;                       Insert, Home, End.
;                       
;                       Key names will be more descriptive
;                       in the gadget.
;
;                       Fixes bugs in the native gadget where
;                       some extended keys were not generating
;                       a gadget event.
;=================================================================

Import "gadget.lib"
  PB_Gadget_SendGadgetCommand(hWnd, EventType)
EndImport

Procedure GetMods()
  Protected mod.b = 0
  If GetAsyncKeyState_(#VK_CONTROL)&32768
    mod.b | #HOTKEYF_CONTROL
  EndIf
  If GetAsyncKeyState_(#VK_SHIFT)&32768
    mod.b | #HOTKEYF_SHIFT
  EndIf
  If GetAsyncKeyState_(#VK_MENU)&32768
    mod.b | #HOTKEYF_ALT
  EndIf
  ProcedureReturn mod
EndProcedure

Procedure HotProc(hwnd, msg, wparam, lparam)

  oldproc = GetProp_(hwnd, "oldproc")
  Select msg
    Case #WM_NCDESTROY
      RemoveProp_(hwnd, "oldproc")
      
    Case #WM_KEYDOWN 
      mod.b = GetMods()
      Select wparam
        Case 13
          SendMessage_(hwnd, #HKM_SETHOTKEY, (mod<<8) | #VK_RETURN, 0 )
          ProcedureReturn 0
        Case 46,110
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|#VK_DELETE, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 8
          SendMessage_(hwnd, #HKM_SETHOTKEY, (mod<<8) | #VK_BACK, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 37,38,39,40
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|wparam, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 100
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|#VK_LEFT, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 104
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|#VK_UP, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 102
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|#VK_RIGHT, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 98
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|#VK_DOWN, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 105
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|33, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 99
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|34, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 103
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|36, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 97
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|35, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
        Case 96
          SendMessage_(hwnd, #HKM_SETHOTKEY, ((mod | #HOTKEYF_EXT)<<8)|#VK_INSERT, 0 )
          PB_Gadget_SendGadgetcommand(hwnd, 0)
          ProcedureReturn 0
      EndSelect
  EndSelect   
  ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
EndProcedure

ProcedureDLL ShortcutGadgetEx(gadgetnum, x, y, w, h, initialvalue=0)
  If gadgetnum=#PB_Any
    gadgetnum = ShortcutGadget(#PB_Any, x, y, w, h, initialvalue)
    result = gadgetnum
  Else
    result = ShortcutGadget(gadgetnum, x, y, w, h, initialvalue)
  EndIf  
  SetProp_(GadgetID(gadgetnum),"oldproc",SetWindowLongPtr_(GadgetID(gadgetnum),#GWL_WNDPROC,@hotproc()))
  ProcedureReturn result
EndProcedure



; Test Prog

; To test: Set a hotkey in the gadget, press "Set" and then press the key combination.
;          This verifies that the shortcut works correctly and that the library didn't 
;          harm the result of GetGadgetState().

;          Any bugs or requested extensions, let me know.

OpenWindow(0, 0, 0, 240, 200, "ShortcutGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
sg = ShortcutGadgetEx(#PB_Any, 20, 20, 200, 25)
ButtonGadget(1, 70,140,100,20,"Set")
SetActiveGadget(sg)

Repeat
  Event = WaitWindowEvent()
  Select Event
 
    Case #PB_Event_Gadget
      If EventGadget()=1
        AddKeyboardShortcut(0, GetGadgetState(sg), 1)
      EndIf
   
    Case #PB_Event_Menu
      Select EventMenu()
        Case 1
          Debug "Shortcut Received"
      EndSelect

  EndSelect

Until Event=#PB_Event_CloseWindow
BERESHEIT
rsts
Addict
Addict
Posts: 2736
Joined: Wed Aug 24, 2005 8:39 am
Location: Southwest OH - USA

Re: Customize the ShortcutGadget

Post by rsts »

Very nice, useful, interesting :D

Happy new year.
User avatar
Arctic Fox
Enthusiast
Enthusiast
Posts: 609
Joined: Sun Dec 21, 2008 5:02 pm
Location: Aarhus, Denmark

Re: Customize the ShortcutGadget

Post by Arctic Fox »

Outstanding example, netmaestro! :shock: :D
Do you know a way to make the nordic letters æ, ø and å uppercase?
Post Reply