Windows应用程序运行机制(笔记)

Windows应用程序:以windows作为平台运行的应用程序。


API函数


API函数:windows提供了大量可以在应用程序中调用的,用C语言编写的函数。

Windows API 函数的功能如下:

1.窗口管理函数:实现窗口的创建、移动和修改等功能。

2.图形设备函数:实现图形的绘制及操作功能,这类型函数的集合又叫做图形设备接口。

3.系统服务函数:实现与操作系统有关的一些功能。

 

窗口与句柄


       在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的;要对某个窗口进行操作,就必须要得到这个窗口的句柄。

句柄:一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。

 

 

消息及消息循环


       Windows应用程序在程序启动并创建了程序窗口之后,随即就进入了一个循环等待状态,直到获取某个消息。系统为每个应用程序都建立了一个叫做消息队列的存储空间,在程序的运行过程中如果发生了一个事件,windows就会把这个事件所对应的消息送人消息队列等待使用。应用程序可以通过调用windows提供的API函数从消息队列中获取消息。一旦获取消息,就把这个消息发给系统,系统会根据消息中的hwnd找到应该接收消息的程序窗口,并根据窗口提供信息,以消息为参数来调用一个用户编写的叫做”窗口函数“的函数在窗口函数中对消息进行处理。处理完毕后,立即返回消息循环,等待获取下一个消息。

       Windows程序设计是一种事件驱动模式的程序设计,主要是基于消息的。Windows应用程序必须接受了消息才会启动某种操作。当用户想要完成某种功能时,会调用操作系统的某种支持。然后操作系统将用户的需要包装成消息,并投递到消息队列当中,最后,应用程序从消息队列中取走消息,并进行响应。

 

 Windows应用程序运行机制(笔记)_第1张图片


Windows应用程序的基本结构

 

一个Windows程序一般由头文件、源文件。动态链接库、资源等几部分组成。


#include//编写Windows程序必须要包含的头文件



LRESULT CALLBACK WndProc(HWND hwnd,//派送消息的窗口句柄
						 UINT message,//系统传递来的消息标示
						 WPARAM wParam,//消息的附加参数
						 LPARAM lParam)//消息的附加参数
{
	//根据相应的消息对应处理程序
	switch (message)
	{
	case WM_LBUTTONDOWN://鼠标左键按下
		{
			MessageBeep(0);//发出声音的API函数
		}
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		//投放一个WM_QUIT消息到消息队列中函数参数将做为
		//WM_QUIT的wParam一般用做WinMain函数的返回值,
		//GetMessage接到WM_QUIT消息时返回0消息循环结束程序退出。
		break;
	default:
		return DefWindowProc(hwnd,message,wParam,lParam);
		//此函数调用默认窗口过程,对应用程序没有处理的消息进
		//行默认处理。在编写窗口过程时一般放在default里
	}
}


//主函数
int WINAPI WinMain(HINSTANCE hInstance,//当前应用程序实例的句柄
				   HINSTANCE PreInstance,//前一个应用程序实例的句柄,
				   //在win32环境下,这个参数总是NULL
				   LPSTR lpCmdLine,//指向本程序命令行的指针
				   int nCmdShow)//决定应用程序窗口显示方式的标志
{
	//创建一个完整的窗口需要以下四个步骤
	HWND hwnd;//定义窗口句柄
	MSG msg;//定义一个用来存储消息的变量
	char lpszClassName[]="窗口";

	WNDCLASS wc;//定义一个窗口类型变量

	//设计一个窗口类
	wc.style=0;//窗口样式
	wc.lpfnWndProc=WndProc;//窗口函数,回调函数
	//对消息进行处理,编写人员完成的部分
	wc.cbClsExtra=0;//类附加内存,通常为设为0
	wc.cbWndExtra=0;//窗口附加内存,通常为设为0
	wc.hInstance=hInstance;//定义应用程序的实例句柄
	wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的图标
	wc.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口的光标
	wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//窗口背景颜色
	wc.lpszMenuName=NULL;//窗口菜单资源名
	wc.lpszClassName=lpszClassName;//窗口类型名

	//注册窗口类
	RegisterClass(&wc);

	//创建窗口
	hwnd=CreateWindow(lpszClassName,//窗口类型名
		              "Windows",//窗口实例的标题
					  WS_OVERLAPPEDWINDOW,//窗口风格
					  0,0,600,400,//(x,y,width,height)位置及大小
					  NULL,//父窗口的句柄
					  NULL,//主菜单的句柄
					  hInstance,//应用程序实例句柄
					  NULL);//一般设为NULL

	//显示及更新窗口
	ShowWindow(hwnd,//窗口句柄
		nCmdShow);//窗口的显示方式
	UpdateWindow(hwnd);//UpdateWindow函数通过发送一个WM_PAINT
	//消息来刷新窗口。UpdateWindow将WM_PAINT消息直接发送给了窗口
	//过程函数进行处理。此消息并没有放进消息队列。
	 
	//消息循环
	//GetMessage()从消息队列获取消息
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);//把键盘消息转换为字符消息
		DispatchMessage(&msg);//向系统派送消息
	}

	return msg.wParam;//WinMain函数结束时,通过return返回一个值给系统。
    //msg.wParam 来自一条表示退出的消息,返回这个值给系统,从而退出。
    //类似于 return 0 ;只是这里这个值不一定也是0,具体取决于是什么消息。
}


参考:http://blog.csdn.net/subleo/article/details/4440532


你可能感兴趣的:(MFC,MFC,windows,应用程序)