Windows 应用程序基础知识
一 API函数
Windows 提供了大量可以再应用程序中调试的,用C编写的函数。这些由操作系统提供的,用户可以使用的函数就是API函数。
API函数的分类:
(1).窗口管理函数:实现窗口的创建、移动和修改等功能
(2)图形设备函数:实现图形的绘制及操作功能,这类函数的集合又叫做图形设备借口
(3)系统服务函数:实现与操作系统有关的一些功能
二 消息和消息循环
Windows应用程序的一个突出特点就是在应用程序启动并创建了程序窗口之后,随机就进入一个等待状态,直到接收到某种刺激(键盘输入、鼠标点击等)之后,程序才会脱离等待状态对这个刺激进行处理,而处理完毕之后又进入等待状态。这些可能触发计算机程序作出相应反应的刺激称为“事件”,而为了描述事件的各种信息(何时,何地等)定义的一个结构即为“消息”
typedef struct tagMSG
{HWND hwnd;//产生消息的窗口句柄
UINT message;//消息的标识码 如MW_LBUTTONDOWN
WPARAM wparam;//附加信息
LPARAM lparam;//附加信息
DWORD time;//消息进入消息队列的时刻
POINT pt;//发送该消息时光标的位置
}MSG;
Windows 系统把大多数事件的消息事先进行了定义,并定义了对应消息的标识码
系统为每个应用程序都建立了一个叫做消息队列的存储空间,在程序的运行过程中如果发生了一个事件,Windows就会把这个事件所对应的消息送入消息队列等待使用。应用程序可以通过调用Windows提供的API函数GetMessage()从消息队列中获取消息。并利用GetMessage()函数的返回值组织一个循环,从而可以不断从消息队列获取消息,一旦获取了一个消息,就把这个消息发送给系统(注:不是把消息发送给应用程序,而是把消息发送给系统!)。这个循环叫做消息循环
while(GetMessage(&msg,NULL,NULL,NULL))
{
TranslateMessage(&msg);//完成键盘消息到字符消息的转换
DispatchMessage(&msg);//把消息派送给系统
}
当函数DispatchMessage()把消息派送给系统后,系统会根据消息中的hwnd找到应该接收消息的程序窗口,并根据窗口提供消息,以消息为参考来调用一个用户编写的“窗口函数”的函数。在窗口函数中,以消息中的标示为依据查找并执行该消息所对应的程序代码,对消息进行处理。处理完毕后,只要该消息不是终止应用程序消息,则会立即返回消息循环,以等待获取下一个消息。
三 Windows应用程序的结构
1. 主函数
为了与DOS C程序的主函数名称相区别,windows应用程序的主函数名为WinMain
int WINAPI WinMain()
{
HINSTANCE hInstance;//当前应用程序实例的句柄
HINSTANCE hPrevInstance ;//前一个应用程序实例的句柄
LPSTR LpCmdLine;//指向本程序命令行的指针
int nCmdShow ;//决定应用程序窗口显示方式的标志
};
主函数包括了消息循环,并且在消息循环之前创建了应用程序的界面---窗口,即主函数的两个任务是创建应用程序窗口和建立消息循环
在创建应用程序窗口之前,必须定义类如样式、背景颜色、窗口图标、窗口函数等一些与窗口相关的属性,规定这些属性必须填写在一个叫做窗口类型的结构体变量中
typedef struct _WNDCLASS
{
UINT style;//窗口样式,一般设置为0
WNDPROC lpfnWndProc;//指向窗口函数的指针,系统在获得了消息后就是根据这个指针去调用窗口函数来处理消息的。即应用程序是依靠这个指针与窗口函数建立联系的
int cbClsExtra ;//一般为0
int cbWndExtra;//一般为0
HANDLE hInstance //定义应用程序的实例句柄
HICON hIcon;//窗口的图标
HCURSOR hCursor;//窗口的光标
HBRUSH hbrbackground;//窗口的背景颜色
LPCTSTR lpszMenuName;//窗口的菜单资源名
LOCTSTR lpszClassName;//窗口类型名
}WNDCLASS;
注册窗口类型
在创建窗口之前,需要把定义好的窗口属性向系统进行登记
BOOL RegisterClass(WNDCLASS &wc);
一旦注册成功,系统中就具有了一个以窗口类型结构最后参数(窗口名)命名的窗口类型,应用程序可以它为模板创建一个或多个窗口
创建窗口
HWND CreatWindow(
LPCTSTR lpClassName,//窗口类型名
LPCTSTR lpWindowName,//窗口实例的标题
DWORD dwStyle,//窗口风格
int x,//窗口左上角位置坐标值x
int y,//窗口左上角位置坐标值Y
int nwidth,//窗口的宽度
int nheight,//窗口的高度
HWND hWndParent,//父窗口的句柄
HMENU hMenu,//主菜单的句柄
HANDLE hInstance,//应用程序实例句柄
LPVOID lpParam//该值为NULL
)
创建窗口成功后,函数返回窗口的句柄,如果应用程序使用该窗口,该句柄应保存在事先定义的句柄变量中,以后就可以用这个句柄来对窗口进行操作
显示窗口
BOOL Showindow(HWND hwnd,//窗口句柄
int nCmdshow//窗口的显示方式)
BOOL UPdateWindow(HWND hwnd//窗口句柄)
2 消息的处理部分--窗口函数
LRESULT CALLBACK WndProc(HWND hwnd,//派送消息的窗口句柄
UINT message,//系统传递来的消息标示
WPARAM wParam,//消息的附加参数
LPARAM lParam//消息的附加参数)
{
switch(message)
{case WM_DESTROY:PostQuitMessage(0);break;
default:return (DefWndPro(hwnd,message,wParam,lParam));
}
return 0;
}
主函数和窗口函数都是由Windows系统来调用的函数,主函数是程序启动之后,系统首先调用的函数,而窗口函数是主函数获得消息并把消息发送个系统之后,由系统依据产生事件的窗口所使用的窗口类型提供的函数指针调用的函数,不同的消息所对应的操作是在窗口函数完成。

浙公网安备 33010602011771号