Code: Select all
;*****************************************************
; Program: TimePickerGadget
; Author: netmaestro
; Date: September 19, 2006
; Target OS: Windows All
; Target Compiler: PureBasic 4.0 +
; License: Free, Use any way you wish,
; credit appreciated but not
; required.
;******************************************************
;
Global _lastgadget, _shour, _smin, _ssec, _sampm, _oldupdown, _oldampm, _oldproc, _updown
Procedure SetClock()
; // TODO
EndProcedure
ProcedureDLL TimePicker_GetHours()
If GetGadgetText(_sampm) = "PM"
ProcedureReturn Val(GetGadgetText(_shour)) + 12
Else
ProcedureReturn Val(GetGadgetText(_shour))
EndIf
EndProcedure
ProcedureDLL TimePicker_GetMinutes()
ProcedureReturn Val(GetGadgetText(_smin))
EndProcedure
ProcedureDLL TimePicker_GetSeconds()
ProcedureReturn Val(GetGadgetText(_ssec))
EndProcedure
Procedure ampmproc(hwnd,msg,wparam,lparam)
result = CallWindowProc_(_oldampm,hwnd,msg,wparam,lparam)
Select msg
Case #WM_LBUTTONDOWN
GetWindowRect_(hwnd,@_editpos.RECT)
SetCursorPos_(_editpos\right,_editpos\top)
SendMessage_(hwnd,#EM_SETSEL,0,-1)
_lastgadget = hwnd
Case #WM_SETFOCUS
SendMessage_(hwnd,#EM_SETSEL,0,-1)
_lastgadget = hwnd
Case #WM_KILLFOCUS
SendMessage_(hwnd,#EM_SETSEL,0,0)
_lastgadget = 0
Case #WM_KEYDOWN
If GetGadgetText(GetDlgCtrlID_(hwnd)) = "AM"
SetGadgetText(GetDlgCtrlID_(hwnd),"PM")
SendMessage_(hwnd,#EM_SETSEL,0,-1)
Else
SetGadgetText(GetDlgCtrlID_(hwnd),"AM")
SendMessage_(hwnd,#EM_SETSEL,0,-1)
EndIf
EndSelect
ProcedureReturn result
EndProcedure
Procedure timeproc(hwnd,msg,wparam,lparam)
result = CallWindowProc_(_oldproc,hwnd,msg,wparam,lparam)
Protected upperlimit, _hourgadget
If GetDlgCtrlID_(hwnd) = _shour
lowerlimit = 1
_hourgadget = #True
upperlimit = 12
firstcharlimit = '1'
lastcharlimit = '2'
Else
lowerlimit = 0
_hourgadget = #False
firstcharlimit = '5'
lastcharlimit = '9'
upperlimit = 59
EndIf
Select msg
Case #WM_LBUTTONDOWN
GetWindowRect_(hwnd,@_editpos.RECT)
SetCursorPos_(_editpos\right,_editpos\top)
SendMessage_(hwnd,#EM_SETSEL,0,-1)
_lastgadget = hwnd
Case #WM_SETFOCUS
SendMessage_(hwnd,#EM_SETSEL,0,-1)
_lastgadget = hwnd
Case #WM_KILLFOCUS
SetGadgetText(GetDlgCtrlID_(hwnd),RSet(GetGadgetText(GetDlgCtrlID_(hwnd)), 2,"0"))
SendMessage_(hwnd,#EM_SETSEL,0,0)
_lastgadget = 0
Case #WM_CHAR
pos = SendMessage_(hwnd,#EM_GETSEL,0,0) & $FFFF
Select pos
Case 1
If wparam < '0' Or wparam > firstcharlimit
If wparam <> 8
SendMessage_(hwnd,#EM_UNDO,0,0)
SendMessage_(hwnd,#EM_SETSEL,0,-1)
EndIf
EndIf
Case 2
If _hourgadget
tmp = Val(Left(GetGadgetText(_shour),1))
If tmp > 0
lastcharlimit = '2'
Else
lastcharlimit = '9'
EndIf
EndIf
If wparam < '0' Or wparam > lastcharlimit
If wparam <> 8
SendMessage_(hwnd,#EM_UNDO,0,0)
SendMessage_(hwnd,#EM_SETSEL,0,-1)
EndIf
Else
SendMessage_(hwnd,#EM_SETSEL,0,-1)
SetClock()
EndIf
EndSelect
Case #WM_KEYDOWN
Select wparam
Case #VK_UP
_valtxt = Val(GetGadgetText(GetDlgCtrlID_(hwnd)))
_valtxt+1
If _hourgadget And _valtxt = 12
If GetGadgetText(_sampm) = "AM"
SetGadgetText(_sampm, "PM")
Else
SetGadgetText(_sampm, "AM")
EndIf
EndIf
If _valtxt > upperlimit
_valtxt = lowerlimit
SetGadgetText(GetDlgCtrlID_(hwnd),RSet(Str(_valtxt),2,"0"))
If GetDlgCtrlID_(hwnd) = _ssec
SendMessage_(GadgetID(_smin),#WM_KEYDOWN,#VK_UP,0)
ElseIf GetDlgCtrlID_(hwnd) = _smin
SendMessage_(GadgetID(_shour),#WM_KEYDOWN,#VK_UP,0)
EndIf
EndIf
SetGadgetText(GetDlgCtrlID_(hwnd),RSet(Str(_valtxt),2,"0"))
SendMessage_(hwnd,#EM_SETSEL,0,-1)
SetClock()
Case #VK_DOWN
_valtxt = Val(GetGadgetText(GetDlgCtrlID_(hwnd)))
_valtxt-1
If _hourgadget And _valtxt = 11
If GetGadgetText(_sampm) = "AM"
SetGadgetText(_sampm, "PM")
Else
SetGadgetText(_sampm, "AM")
EndIf
EndIf
If _valtxt < lowerlimit
_valtxt = upperlimit
SetGadgetText(GetDlgCtrlID_(hwnd),RSet(Str(_valtxt),2,"0"))
If GetDlgCtrlID_(hwnd) = _ssec
SendMessage_(GadgetID(_smin),#WM_KEYDOWN,#VK_DOWN,0)
ElseIf GetDlgCtrlID_(hwnd) = _smin
SendMessage_(GadgetID(_shour),#WM_KEYDOWN,#VK_DOWN,0)
EndIf
EndIf
SetGadgetText(GetDlgCtrlID_(hwnd),RSet(Str(_valtxt),2,"0"))
SendMessage_(hwnd,#EM_SETSEL,0,-1)
SetClock()
EndSelect
EndSelect
ProcedureReturn result
EndProcedure
Procedure updownproc(hwnd,msg,wparam,lparam)
result = CallWindowProc_(_oldupdown,hwnd,msg,wparam,lparam)
If _lastgadget
_target = _lastgadget
Else
_target = GadgetID(_sampm)
EndIf
Select msg
Case #WM_KILLFOCUS
If GetAsyncKeyState_(#VK_TAB) & 32768
SetFocus_(GadgetID(_shour))
EndIf
Case #WM_LBUTTONDOWN
If _target
If lparam >> 16 > 13
SendMessage_(_target,#WM_KEYDOWN,#VK_DOWN,0)
Else
SendMessage_(_target,#WM_KEYDOWN,#VK_UP,0)
EndIf
EndIf
Case #WM_TIMER
GetCursorPos_(@cp.POINT)
MapWindowPoints_(0,hwnd,@cp,1)
If cp\y > 13
SendMessage_(_target,#WM_KEYDOWN,#VK_DOWN,0)
Else
SendMessage_(_target,#WM_KEYDOWN,#VK_UP,0)
EndIf
EndSelect
ProcedureReturn result
EndProcedure
ProcedureDLL TimePickerGadget(gadget, x, y)
*unpacked = AllocateMemory(5376)
UnpackMemory(?PicPak, *unpacked)
_img1 = CatchImage(#PB_Any, *unpacked, 5376)
DataSection
PicPak:
Data.b $4A,$43,$00,$15,$00,$00,$3C,$EE,$28,$70,$A4,$A9,$D0,$20,$A6,$51,$A4,$62,$4A,$28
Data.b $23,$C0,$28,$4D,$94,$BA,$31,$C0,$18,$09,$44,$88,$A2,$F2,$30,$08,$6C,$A1,$5D,$D1
Data.b $7F,$0A,$F5,$87,$41,$F1,$8C,$09,$EA,$56,$A1,$48,$00,$AF,$8F,$64,$2F,$10,$75,$63
Data.b $50,$FC,$DE,$75,$80,$51,$F5,$FF,$78,$54,$79,$D7,$01,$46,$58,$7D,$85,$41,$00,$00
Data.b $10,$89
PicPakend:
EndDataSection
_cont = ContainerGadget(gadget, x,y,115,26)
_updownCtrlID = 7000+Random(1000) ; Choose a unique #gadget for the updown control
While IsGadget(_updownCtrlID)
_updownCtrlID = 7000+Random(1000)
Wend
_updown = CreateWindowEx_(0,"msctls_updown32","",#WS_CHILD|#WS_VISIBLE,96,0,20,22,GadgetID(_cont),_updownCtrlID,GetModuleHandle_(0),0)
_cont2 = ContainerGadget(#PB_Any,0,1,95,21,#PB_Container_Flat)
_imgg1 = ImageGadget(#PB_Any,0,0,0,0,ImageID(_img1))
DisableGadget(_imgg1, 1)
_shour = StringGadget(#PB_Any,8,3,16,14,"",#PB_String_BorderLess)
_smin = StringGadget(#PB_Any,32,3,16,14,"",#PB_String_BorderLess)
_ssec = StringGadget(#PB_Any,55,3,16,14,"",#PB_String_BorderLess)
_sampm = StringGadget(#PB_Any,71,3,16,14,"",#PB_String_BorderLess|#PB_String_ReadOnly)
CloseGadgetList()
CloseGadgetList()
SendMessage_(GadgetID(_shour),#EM_LIMITTEXT,2,0)
SendMessage_(GadgetID(_smin),#EM_LIMITTEXT,2,0)
SendMessage_(GadgetID(_ssec),#EM_LIMITTEXT,2,0)
_oldupdown = SetWindowLong_(_updown,#GWL_WNDPROC,@updownproc())
_oldampm = SetWindowLong_(GadgetID(_sampm),#GWL_WNDPROC,@ampmproc())
_oldproc = SetWindowLong_(GadgetID(_shour),#GWL_WNDPROC,@timeproc())
_oldproc = SetWindowLong_(GadgetID(_smin),#GWL_WNDPROC,@timeproc())
_oldproc = SetWindowLong_(GadgetID(_ssec),#GWL_WNDPROC,@timeproc())
SetGadgetColor(_sampm,#PB_Gadget_BackColor,#White)
ShowWindow_(GadgetID(_cont),#SW_SHOW)
SetGadgetText(_smin, RSet(Str(Minute(Date())),2,"0"))
SetGadgetText(_ssec, RSet(Str(Second(Date())),2,"0"))
If Hour(Date()) >= 12
SetGadgetText(_shour, RSet(Str(Hour(Date())-12),2,"0"))
SetGadgetText(_sampm, "PM")
Else
SetGadgetText(_shour, RSet(Str(Hour(Date())),2,"0"))
SetGadgetText(_sampm, "AM")
EndIf
ProcedureReturn _cont
EndProcedure
Code: Select all
IncludeFile "TimePicker.pb"
OpenWindow(0,0,0,320,240,"",$CF0001)
CreateGadgetList(WindowID(0))
gadget = TimePickerGadget(#PB_Any, 90, 100)
ButtonGadget(0,90,130,100,20,"Get Time Values")
Repeat
ev = WaitWindowEvent()
If ev=#PB_Event_Gadget
If EventGadget()=0
Debug TimePicker_GetHours()
Debug TimePicker_GetMinutes()
Debug TimePicker_GetSeconds()
EndIf
EndIf
Until ev=#WM_CLOSE