PayCalc
Jump to navigation
Jump to search
Script: payCalc
Author: Jon Dunham
Description: Simple GUI example to calculate hourly pay in real-time.
Notes: "my code is a dog's code" - R. Beef Kazenzakis
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region GUI setup
; create main window/form/frame
$formPC = GUICreate("payCalc", 251, 136, 346, 590)
; create labels. it's generally not necessary to set the returned handle
; to a variable on static label controls you know you won't be interacting with
GUICtrlCreateLabel("Time:", 8, 8, 30, 17)
GUICtrlCreateLabel("Total pay:", 8, 32, 51, 17)
; create read-only status boxes
$tTime = GUICtrlCreateInput("", 72, 8, 121, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
$tTotal = GUICtrlCreateInput("", 72, 32, 121, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
; create buttons. use $BS_DEFPUSHBUTTON constant on Start to make it the default button for when {ENTER} is pressed.
; the ampersand character specifies the alt-key shortcut to use
$btnStart = GUICtrlCreateButton("&Start", 8, 104, 75, 25, $BS_DEFPUSHBUTTON)
$btnStop = GUICtrlCreateButton("S&top", 88, 104, 75, 25)
$btnReset = GUICtrlCreateButton("&Reset", 168, 104, 75, 25)
; rate label and input controls
GUICtrlCreateLabel("Rate ($/hr):", 8, 72, 59, 17)
$inRate = GUICtrlCreateInput("0.00", 72, 72, 57, 21)
; finally, show the GUI
GUISetState(@SW_SHOW)
#EndRegion
; init global var to keep track of the last timestamp if "Stop" is clicked
Global $lastTime = 0
While 1
; main/idle GUI switch statement
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
GUIDelete()
Exit
Case $btnStart
; enter calc function when Start is clicked
payCalc()
Case $btnReset
; zero out gui controls and whatnot
GUICtrlSetData($tTime, "")
GUICtrlSetData($tTotal, "")
$lastTime = 0
EndSwitch
Sleep(10)
WEnd
Func payCalc()
; start the timer
$timer = TimerInit()
; get the rate of pay to multiply based on the update interval, which in this case is 100 milliseconds or 1/10th second
$calcRate = Number(GUICtrlRead($inRate))/60/600
While 1
; check GUI for events
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
GUIDelete()
Exit
Case $btnStop
; when Stop button is clicked, set that global lastTime var to the current timestamp plus itself (+=) if we return to this function
$lastTime += TimerDiff($timer)
WinSetTitle($formPC, "", "payCalc")
; return to main loop
Return
EndSwitch
; update the time edit box, adding a millisecond display 'cause it's fun to watch numbers... i guess
GUICtrlSetData($tTime, timeFormat(TimerDiff($timer)+$lastTime) & " [" & Round(Mod(TimerDiff($timer), 1000), 0) & "]")
; multiply the adjusted rate by how much time has passed in ms/10 and set edit control, window title and traytip
$totalPay = Round($calcRate * ((TimerDiff($timer)+$lastTime)/100), 2)
WinSetTitle($formPC, "", "$" & $totalPay & " [payCalc]")
TraySetToolTip("$" & $totalPay & @CRLF & timeFormat(TimerDiff($timer)+$lastTime))
GUICtrlSetData($tTotal, "$" & $totalPay)
; sleep before looping
Sleep(100)
WEnd
EndFunc
func timeFormat($ms, $sepChar = ":")
; custom function to make a nice HH:MM:SS display from a given time in milliseconds
dim $sec, $min, $hr
dim $s = round($ms/1000, 0 )
$sec = mod($s, 60)
if $sec < 10 then $sec = "0" & $sec
$min = Floor(mod($s/60, 60))
if $min < 10 then $min = "0" & $min
$hr = Floor($s/3600)
if $hr < 10 then $hr = "0" & $hr
Return $hr & $sepChar & $min & $sepChar & $sec
EndFunc ; <== timeFormat