大家都知道在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
三、运行截图
四、资源文件下载
1935



被折叠的 条评论
为什么被折叠?



