Junkie
Location: North Hollywood
|
I upated it again and added the code ( should run at the right rate )
if this posts right, i'll be very suprised :) (ok edit for disable smileys, i bet when they came up with :DWORD they werent expecting cheesy grins , dunno about the double line feed though, try small size)
Code:
.386
.model flat, stdcall
option casemap:none
;===============================================================================================
; include
;===============================================================================================
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \MASM32\include\gdi32.inc
include \MASM32\include\MASM32.inc
include \MASM32\INCLUDE\advapi32.inc
;===============================================================================================
; libs
;===============================================================================================
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\gdi32.lib
includelib \MASM32\lib\gdi32.lib
includelib \MASM32\lib\MASM32.lib
includelib \MASM32\LIB\advapi32.lib
;===============================================================================================
; prototypes
;===============================================================================================
main PROTO :DWORD
SetBmpColor PROTO :DWORD
GetRateProc PROTO :HWND,:DWORD,:WPARAM,:LPARAM
Float2ASCII PROTO
CalcRate2 PROTO
;===============================================================================================
; macros
;===============================================================================================
LOWORD MACRO bigword ;; Retrieves the low word from double word argument
mov eax,bigword
and eax,0FFFFh ;; Set to low word
ENDM
return MACRO arg
mov eax, arg
ret
ENDM
;===============================================================================================
; defines
;===============================================================================================
.const
WM_SHELLNOTIFY equ WM_USER+5
IDI_TRAY equ 0
; icon resource number
ProgIcon equ 100
; menu ID's
IDM_Pause equ 1005
IDM_Stop equ 1004
IDM_Start equ 1003
IDM_ChangeRate equ 1002
; standard items
IDM_AboutBox equ 1001
IDM_Quit equ 1000
IDB_Pause equ 10002
IDB_AboutBox equ 10001
IDB_Quit equ 10000
IDC_DOLLARS equ 1000
IDC_CENTS equ 1001
ID_OK equ 1003
IDD_RATE equ 9; ; hmm how did i manage that one
Count equ 14
; simple state
STATE_STOPPED equ 1
STATE_STARTED equ 2
STATE_PAUSED equ 3
STATE_ABOUT equ 4
;===============================================================================================
; const non bss data
;===============================================================================================
.data
currentState db STATE_STOPPED
ProcessInfo PROCESS_INFORMATION <>
; ---------------------------------
ClassName db "WaiwWinClass", 0
ProgramName db "WAIW", 0
NotRunningText db "Stopped", 0
; ---------------------------------
SetHourlyText db "&Change hourly rate", 0
StartText db "&Start", 0
StopText db "S&top", 0
PauseText db "&Pause", 0
; ---------------------------------
AboutBoxTitle db "About", 0
AboutBoxText db "WAIW, Copyright © 2003 charliex, root@charliex.net", 0
; ---------------------------------
QuitText db "&Quit", 0
ConfirmText db "Are you sure you wish to quit ?", 0
; ---------------------------------
ChangeRateText db "Changing rate", 0
StartedText db "Running", 0
PausedText db "Paused", 0
div60 dd 03c888889h
div2 dd 03c23d70ah
fipaddcon dd 000000000h,04f800000h
startMS dd 0
milliSeconds dd 0
startTime dd 0
; rate per hour
ratePerHour dd 100
; how much made so far
made REAL4 0.0
; internal calcs, exposed for debugging
rph REAL4 0.0
; temp buff
buffer db 255 dup (0)
;===============================================================================================
; non const data
;===============================================================================================
ETDBuffer db "ETD : $"
ETDData db 128 dup (0)
;===============================================================================================
; non const bss data
;===============================================================================================
.data?
hInstance dd ?
note NOTIFYICONDATA <>
StatusInfo db ?
hPopupMenu dd ?
hBmp1 dd ? ; bitmap handle
IDM dd ? ; menu number id
IDB dd ? ; menu bitmap id
;===============================================================================================
; code
;===============================================================================================
.code
code:
invoke GetModuleHandle, NULL
mov hInstance, eax
; call our main
invoke main, hInstance
invoke ExitProcess, eax
;===============================================================================================
; WinMain
;===============================================================================================
main PROC hInst:HINSTANCE
LOCAL WindowClass : WNDCLASSEX
LOCAL Msg : MSG
LOCAL hWindow : HWND
mov WindowClass.cbSize, SIZEOF WNDCLASSEX
mov WindowClass.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov WindowClass.lpfnWndProc, OFFSET WindowProc
mov WindowClass.cbClsExtra, NULL
mov WindowClass.cbWndExtra, NULL
push hInst
pop WindowClass.hInstance
mov WindowClass.hbrBackground, COLOR_APPWORKSPACE
mov WindowClass.lpszMenuName, NULL
mov WindowClass.lpszClassName, OFFSET ClassName
; load icon
invoke LoadIcon, hInstance, ProgIcon
mov WindowClass.hIcon, eax
mov WindowClass.hIconSm, eax
invoke LoadCursor, hInstance, IDC_ARROW
mov WindowClass.hCursor, eax
invoke RegisterClassEx, ADDR WindowClass
invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDR ClassName, ADDR ProgramName,\
0, \
CW_USEDEFAULT, CW_USEDEFAULT, 100, 100, NULL, NULL,\
hInst, NULL
mov hWindow, eax
; process message pump
.while TRUE
invoke GetMessage, ADDR Msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR Msg
invoke DispatchMessage, ADDR Msg
.endw
mov eax, Msg.wParam
ret
main ENDP
;===============================================================================================
; WindowProc
;===============================================================================================
WindowProc PROC hWindow:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL pt : POINT
LOCAL StartInfo : STARTUPINFO
LOCAL hWnd : HWND
LOCAL Nb: QWORD
.code
.if uMsg==WM_CREATE
invoke CreatePopupMenu
mov hPopupMenu, eax
invoke AppendMenu, hPopupMenu, MF_STRING, IDM_Start, ADDR StartText
invoke AppendMenu, hPopupMenu, MF_STRING, IDM_Stop, ADDR StopText
invoke AppendMenu, hPopupMenu, MF_STRING, IDM_Pause, ADDR PauseText
invoke AppendMenu, hPopupMenu, MF_STRING, IDM_ChangeRate, ADDR SetHourlyText
invoke AppendMenu, hPopupMenu, MF_SEPARATOR, NULL, NULL
invoke AppendMenu, hPopupMenu, MF_STRING, IDM_AboutBox , ADDR AboutBoxTitle
invoke AppendMenu, hPopupMenu, MF_SEPARATOR, NULL, NULL
invoke AppendMenu, hPopupMenu, MF_STRING, IDM_Quit , ADDR QuitText
mov ecx, Count
mov IDB, IDB_Quit
mov IDM, IDM_Quit
loadBitmaps:
push ecx
invoke LoadBitmap, hInstance, IDB
mov hBmp1, eax
invoke SetBmpColor, hBmp1
mov hBmp1, eax
invoke SetMenuItemBitmaps, hPopupMenu, IDM, MF_BYCOMMAND, hBmp1, hBmp1
pop ecx
inc IDB
inc IDM
LOOP loadBitmaps
mov note.cbSize, SIZEOF NOTIFYICONDATA
push hWindow
pop note.hwnd
mov note.uID, IDI_TRAY
mov note.uFlags, NIF_ICON+NIF_MESSAGE+NIF_TIP
mov note.uCallbackMessage, WM_SHELLNOTIFY
invoke LoadIcon, hInstance, ProgIcon
mov note.hIcon, eax
; set the program tool trap icons tool tip
invoke lstrcpy, ADDR note.szTip, ADDR NotRunningText
invoke Shell_NotifyIcon, NIM_ADD, ADDR note
.elseif uMsg==WM_COMMAND
.if lParam==0
mov eax, wParam
.if ax==IDM_Quit
invoke MessageBox, NULL, ADDR ConfirmText, ADDR ProgramName, MB_YESNO or MB_ICONINFORMATION
.if eax==IDNO
invoke Shell_NotifyIcon, NIM_ADD, ADDR note
.else
invoke DestroyWindow, hWindow
.endif
.elseif ax==IDM_AboutBox
cmp StatusInfo, 1
jz menu
inc StatusInfo
invoke LoadIcon, NULL, IDI_INFORMATION
mov note.hIcon, eax
invoke lstrcpy, ADDR note.szTip, ADDR AboutBoxTitle
invoke Shell_NotifyIcon, NIM_MODIFY, ADDR note
invoke LoadIcon, hInstance, ProgIcon
invoke ShellAbout, NULL,ADDR AboutBoxTitle, ADDR AboutBoxText, eax
dec StatusInfo
; change this to show the current status instead.
;; invoke lstrcpy, ADDR note.szTip, ADDR NotRunningText
invoke LoadIcon, hInstance, ProgIcon
mov note.hIcon, eax
invoke Shell_NotifyIcon, NIM_MODIFY, ADDR note
menu:
.elseif ax==IDM_ChangeRate
; popup a dialog asking use to set the hourly rate
invoke lstrcpy, ADDR note.szTip, ADDR ChangeRateText
invoke Shell_NotifyIcon, NIM_MODIFY, ADDR note
invoke DialogBoxParam, hInstance, IDD_RATE,0,ADDR GetRateProc,NULL
.elseif ax==IDM_Stop
; stop counting
invoke lstrcpy, ADDR note.szTip, ADDR NotRunningText
invoke Shell_NotifyIcon, NIM_MODIFY, ADDR note
invoke KillTimer, hWnd, 0
.elseif ax==IDM_Start
; get the current ms counter
invoke GetTickCount
; clear up old one not needed anymore
mov startMS, eax
mov startTime,eax
; start of a windows timer for n seconds
invoke SetTimer,hWindow,NULL,(1*60)*1000,NULL ; Set the timer to 60000 mSec (1 min)
; start counting
invoke lstrcpy, ADDR note.szTip, ADDR StartedText
invoke Shell_NotifyIcon, NIM_MODIFY, ADDR note
.elseif ax==IDM_Stop
; pause counting
invoke lstrcpy, ADDR note.szTip, ADDR PausedText
invoke Shell_NotifyIcon, NIM_MODIFY, ADDR note
invoke KillTimer, hWnd, 0
.endif
.endif
.elseif uMsg==WM_SHELLNOTIFY
.if wParam==IDI_TRAY
.if (lParam==WM_LBUTTONDOWN) || (lParam==WM_RBUTTONDOWN)
; popup menu
invoke GetCursorPos, ADDR pt
invoke TrackPopupMenu, hPopupMenu, TPM_LEFTALIGN, pt.x, pt.y, NULL, hWindow, NULL
.endif
.endif
.elseif uMsg==WM_TIMER
; temp test, remove later !! :)
; mov ratePerHour,600
; calculate
invoke CalcRate2
; convert current amount made from float to ascii,
lea esi,made
fld dword ptr [esi]
fstp [Nb]
invoke FloatToStr, [Nb], ADDR ETDData
; invoke DebugPrint, addr ETDBuffer
invoke lstrcpy, ADDR note.szTip, ADDR ETDBuffer
invoke OutputDebugStringA, ADDR ETDBuffer
invoke Shell_NotifyIcon, NIM_MODIFY, ADDR note
.elseif uMsg==WM_DESTROY
; quit
invoke Shell_NotifyIcon, NIM_DELETE, ADDR note
invoke PostQuitMessage, NULL
return 0
.endif
invoke DefWindowProc, hWindow, uMsg, wParam, lParam
ret
WindowProc ENDP
;===============================================================================================
; SetBmpColor
;===============================================================================================
SetBmpColor proc hBitmap:DWORD
LOCAL mDC :DWORD
LOCAL hBrush :DWORD
LOCAL hOldBmp :DWORD
LOCAL hReturn :DWORD
LOCAL hOldBrush :DWORD
invoke CreateCompatibleDC, NULL
mov mDC, eax
invoke SelectObject, mDC, hBitmap
mov hOldBmp, eax
invoke GetSysColor, COLOR_BTNFACE
invoke CreateSolidBrush, eax
mov hBrush, eax
invoke SelectObject, mDC, hBrush
mov hOldBrush, eax
invoke GetPixel,mDC, 1, 1
invoke ExtFloodFill, mDC, 1, 1, eax, FLOODFILLSURFACE
invoke SelectObject, mDC, hOldBrush
invoke DeleteObject, hBrush
invoke SelectObject, mDC, hBitmap
mov hReturn, eax
invoke DeleteDC, mDC
mov eax, hReturn
ret
SetBmpColor endp
;===============================================================================================
; GetRateProc
;===============================================================================================
GetRateProc proc hDlg:HWND,iMsg:DWORD,wParam:WPARAM, lParam:LPARAM
LOCAL rateDollars:DWORD
LOCAL rateCents:DWORD
mov eax,iMsg
.if eax==WM_INITDIALOG
.elseif eax==WM_COMMAND
LOWORD wParam
.if eax==ID_OK
invoke GetDlgItemInt, hDlg,IDC_DOLLARS,NULL,0
mov rateDollars,eax
; convert to p
mov ebx,100
mul ebx
mov ratePerHour,eax
invoke GetDlgItemInt, hDlg,IDC_CENTS,NULL,0
mov rateCents,eax
; add to dollarrs for one figure in units
add ratePerHour,eax
invoke EndDialog,hDlg,TRUE
.elseif eax==IDCANCEL
invoke EndDialog,hDlg,FALSE
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
GetRateProc endp
;===============================================================================================
; Float2ASCII - Convert a float to an ASCIZ string
;===============================================================================================
Float2ASCII proc
LOCAL Nb:QWORD
fld QWORD PTR [esi]
fstp [Nb]
invoke FloatToStr, [Nb], ADDR ETDData
ret
Float2ASCII endp
;===============================================================================================
; CalcRate2 - Calculate how much has been earnt since started.
;===============================================================================================
CalcRate2 proc
; use a local!!
sub esp, 8
; ms = GetTickCount()-startTime;
; get current ms counter
invoke GetTickCount
; eax = edx = ms
mov edx, eax
; rph = rateperhour
fild dword ptr ratePerHour
; this really only needs to be done everytime the rate is updated or at start
; rph = rph/100.0
fmul dword ptr div2
; get start time in ms
mov ecx, dword ptr startTime
; made = rph * (( ms/60.0)/60.0)
fld dword ptr div60
fxch st(1)
; store as float / 100.0
fst dword ptr rph
; ms = current - last
sub edx, ecx
mov eax, 274877907
mul edx
shr edx, 6
; store secs count (for debug) yes yes i know it says ms, its milli vanilli seconds
mov dword ptr milliSeconds, edx
; now do the actual math
mov dword ptr [esp], edx
fild dword ptr [esp]
shr edx, 31
fadd dword ptr fipaddcon[0+edx*4]
fmul st, st(2)
fmulp st(2), st
fmulp st(1), st
; store the amount calculated
fstp dword ptr made
; use a local!
add esp, 8
ret
CalcRate2 endp
end code
Last edited by charliex; 11-19-2003 at 10:50 PM..
|