第六篇 Windows定时器

大家都知道在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

 

 

你可能感兴趣的:(第六篇 Windows定时器)