爱悠闲 > Windows学习心得【计时器2】

Windows学习心得【计时器2】

分类: Windows学习日记  |  标签: winapi,windows,源码  |  作者: u013517637 相关  |  发布日期 : 2015-06-02  |  热度 : 1290°
#include<windows.h>

#define ID_TIMER 1

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//首先是一个回调函数的声明
VOID CALLBACK TimerProc(HWND ,UINT ,UINT ,DWORD);

int WINAPI WinMain(HINSTANCE hInstance,//应用程序当前实例的句柄 
				   HINSTANCE hPrevinstance,//应用程序先前的实例句柄
				   PSTR szCmdLine,//指向应用程序命令行的字符串的指针 
				   int iCmdShow)//指明窗口如何显示
{
	static TCHAR szAppName[]=TEXT("Beeper2");
	HWND hwnd;//当前实例的句柄 
	MSG msg;//消息
	WNDCLASS wndclass;//类名

	wndclass.style=CS_HREDRAW | CS_VREDRAW;//窗口的显示方式,此处为水平重画和竖直重画
	wndclass.cbClsExtra=0;//窗口扩展,此处为0 
	wndclass.cbWndExtra=0;//窗口实例扩展,此处为0
	wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景颜色的设置,此处设置为白色
	wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//鼠标的显示方式,此处设置为标准型
	wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的显示方式,此处设置为应用程序型   
	wndclass.hInstance=hInstance;//窗口的实例句柄
	wndclass.lpfnWndProc=WndProc;//窗口回调函数
	wndclass.lpszClassName=szAppName;//窗口类名
	wndclass.lpszMenuName=NULL;//窗口菜单,此处没菜单设为NULL 

	if(!RegisterClass(&wndclass))//注册窗口,若注册失败,产生如下的信息
	{
		MessageBox(NULL,TEXT("Program requires Windows NT!"),
			szAppName,MB_ICONERROR);
		return 0;
	}

	////创建窗口,如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL。
	hwnd=CreateWindow(szAppName,
		TEXT("Beerer2 Timer Demo"),//窗口的名字 
		WS_OVERLAPPEDWINDOW,//指定创建窗口的风格
		CW_USEDEFAULT,//指定窗口的初始水平位置,如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数
		CW_USEDEFAULT,//指定窗口的初始垂直位置 
		CW_USEDEFAULT,//以设备单元指明窗口的宽度。若是CW_USEDEFAULT,则系统为窗口选择一个缺省的宽度
		CW_USEDEFAULT,//以设备单元指明窗口的高度。若被设为CW_USEDEFAULT,则系统忽略nHeight参数。
		NULL,//指向被创建窗口的父窗口或所有者窗口的句柄,此处为NULL 
		NULL,//菜单句柄,或依据窗口风格指明一个子窗口标识,此处为NULL
		hInstance,//与窗口相关联的模块实例的句柄。  
		NULL);//指向一个值的指针,该值传递给窗口WM_CREATE消息  

	ShowWindow(hwnd,iCmdShow);//显示窗口,hWnd:指窗口句柄。iCmdShow:指定窗口如何显示。  
	UpdateWindow(hwnd);//更新窗口,hWnd:指窗口句柄。  

	while(GetMessage(&msg,NULL,0,0))//消息循环
	{
		TranslateMessage(&msg);//该函数将虚拟键消息转换为字符消息  
		DispatchMessage(&msg);//该函数分发一个消息给窗口程序。
	}
	return msg.wParam;//wParam是消息携带的参数,可以是个值,也可以是个地址   
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)//回调函数
{ 
	switch(message)
	{
	case WM_CREATE:
		//SetTimer创建或设置一个定时器
		//如果函数成功,hWnd参数为非0,则返回一个非零的整数,可以把这个非零的整数传递给KillTimer来销毁时钟.
		//hwnd是一个窗口句柄,它指向接收WM_TIMER消息的窗口过程
		//第二个参数是一个计时器的ID,它不能为0
		//第三个参数是一个32位的无符号整数,它指定以毫秒为单位的时间间隔
		//第四个参数一般为NULL,系统将会向消息队列中放入一个WM_TIMER消息,
		//在此为TimerProc,系统向TimerProc消息队列中放入消息
		SetTimer(hwnd,ID_TIMER,1000,TimerProc);
		return 0;
	case WM_DESTROY:
		KillTimer(hwnd,ID_TIMER);//移除定时器函数的声明:移除先前用SetTimer设置的定时器。在定时器使用完毕后移除定时器时使用
		//第一个参数与定时器相关联的窗口句柄
		//第二个参数为定时器标识符
		PostQuitMessage(0);//该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);//该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理
}

VOID CALLBACK TimerProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime)
{
	static BOOL fFlipFlop=FALSE;

	HBRUSH hBrush;//画刷的句柄

	HDC hdc;//句柄

	RECT rc;//一个矩形的结构体

	MessageBeep(-1);//essageBeep函数用来播放一个波形声音,
	//上面的-1其实就是0xFFFFFFFF表示从扬声器中播放出一段蜂鸣声。详细参数参考MSDN

	fFlipFlop=!fFlipFlop;

	GetClientRect(hwnd,&rc);//该函数获取窗口客户区的坐标
	hdc=GetDC(hwnd);

	hBrush=CreateSolidBrush(fFlipFlop?RGB(255,0,0):RGB(0,0,255));
	//CreateSolidBrush函数创建一个具有指定颜色的逻辑刷子。
	//如果该函数执行成功,那么返回值标识一个逻辑实心刷子;如果函数失败,那么返回值为NULL
	//参数为指定刷子的颜色

	FillRect(hdc,&rc,hBrush);
	//FillRect函数用指定的画刷填充矩形
	//hdc:设备环境句柄。
	//第二个参数为指向含有将填充矩形的逻辑坐标的RECT结构的指针
	//第三个参数用来填充矩形的画刷的句柄

	ReleaseDC(hwnd,hdc);

	DeleteObject(hBrush);//函数功能:释放画刷句柄
}