大家都知道在8086汇编中,我们可以直接利用int 8h中断来达到计时的目的。显然,Win32
编程是不会直接让用户来操作中断的。Windows提供了定时器来达到相同的目的。
当用户需要使用定时器时,要向Windows申请,SetTimer;结束时,需要释放,KillTmer。
需要注意的是,Windows定时器还是基于时钟中断的,所以精度是55ms。如果用户设定一个
任意时间产生中断,则可能存在一定的误差。
用法参见代码:
一、资源文件定义
#include <resource.h> #define DLG_MAIN 1 #define ICO_1 1 #define ICO_2 2 #define IDC_SETICON 100 #define IDC_COUNT 101 ICO_1 ICON "1.ico" ICO_2 ICON "2.ico" DLG_MAIN DIALOG 50,50,113,40 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "定时器例子" FONT 9,"宋体" { ICON ICO_1,IDC_SETICON,8,9,18,21 LTEXT "计数:",-1,35,16,25,10 LTEXT "",IDC_COUNT,62,16,40,10 }
二、主体代码
.386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib ID_TIMER1 equ 1 ID_TIMER2 equ 2 ICO_1 equ 1 ICO_2 equ 2 DLG_MAIN equ 1 IDC_SETICON equ 100 IDC_COUNT equ 101 .data hInstance dd ? hWinMain dd ? dwCount dd ? idTimer dd ? .code _ProcTimer proc _hWnd,uMsg,_idEvent,_dwTime pushad invoke GetDlgItemInt,hWinMain,IDC_COUNT,NULL,FALSE inc eax invoke SetDlgItemInt,hWinMain,IDC_COUNT,eax,FALSE popad ret _ProcTimer endp _ProcDlgMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam mov eax,uMsg .if eax == WM_TIMER mov eax,wParam .if eax == ID_TIMER1 inc dwCount mov eax,dwCount and eax,1 inc eax invoke LoadIcon,hInstance,eax invoke SendDlgItemMessage,hWnd,\ IDC_SETICON,STM_SETIMAGE,\ IMAGE_ICON,eax .elseif eax == ID_TIMER2 invoke MessageBeep,-1 .endif .elseif eax == WM_INITDIALOG push hWnd pop hWinMain invoke SetTimer,hWnd,ID_TIMER1,250,NULL invoke SetTimer,hWnd,ID_TIMER2,2000,NULL invoke SetTimer,NULL,NULL,1000,addr _ProcTimer mov idTimer,eax .elseif eax == WM_CLOSE invoke KillTimer,hWnd,ID_TIMER1 invoke KillTimer,hWnd,ID_TIMER2 invoke KillTimer,NULL,idTimer invoke EndDialog,hWnd,NULL .else mov eax,FALSE ret .endif mov eax,TRUE ret _ProcDlgMain endp start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,DLG_MAIN,\ NULL,offset _ProcDlgMain,NULL invoke ExitProcess,NULL end start
三、运行截图
四、资源文件下载
1.ICO 2.ICO