Windows应用程序:以windows作为平台运行的应用程序。
API函数
API函数:windows提供了大量可以在应用程序中调用的,用C语言编写的函数。
Windows API 函数的功能如下:
1.窗口管理函数:实现窗口的创建、移动和修改等功能。
2.图形设备函数:实现图形的绘制及操作功能,这类型函数的集合又叫做图形设备接口。
3.系统服务函数:实现与操作系统有关的一些功能。
窗口与句柄
在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的;要对某个窗口进行操作,就必须要得到这个窗口的句柄。
句柄:一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。
消息及消息循环
Windows应用程序在程序启动并创建了程序窗口之后,随即就进入了一个循环等待状态,直到获取某个消息。系统为每个应用程序都建立了一个叫做消息队列的存储空间,在程序的运行过程中如果发生了一个事件,windows就会把这个事件所对应的消息送人消息队列等待使用。应用程序可以通过调用windows提供的API函数从消息队列中获取消息。一旦获取消息,就把这个消息发给系统,系统会根据消息中的hwnd找到应该接收消息的程序窗口,并根据窗口提供信息,以消息为参数来调用一个用户编写的叫做”窗口函数“的函数在窗口函数中对消息进行处理。处理完毕后,立即返回消息循环,等待获取下一个消息。
Windows程序设计是一种事件驱动模式的程序设计,主要是基于消息的。Windows应用程序必须接受了消息才会启动某种操作。当用户想要完成某种功能时,会调用操作系统的某种支持。然后操作系统将用户的需要包装成消息,并投递到消息队列当中,最后,应用程序从消息队列中取走消息,并进行响应。
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