1.1API与SDK
API:Application Programming Interface
SDK:Software Development Kit
1.2窗口与句柄
一个Windows应用程序至少要有一个窗口,称为主窗口。
一个应用程序窗口通常都包含标题栏、菜单栏、系统菜单、最大最小化框、可调边框、及滚动条。
窗口分为客户区和非客户区。
在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。句柄(HANDLE)。
1.3消息与消息队列
Windows程序设计是一种事件驱动方式的程序设计模式,主要是基于消息的。
在Windows程序中,消息是由MSG结构体来表示的。
typedf struct tagMSG{
HWND hwnd;//成员变量hwnd表示消息所属窗口
UINT message;//成员变量message指定了消息的标识符
WPARAM wParam;//用于指定消息的附加消息
LPARAM lParam;//用于指定消息的附加消息
DWORD time;//消息投递到消息队列中的时间
POINT pt;//鼠标当前位置
}MSG;
每一个Windows程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息。
Windows程序中的消息可以分为“进队消息”和“不进队消息”。
进队的消息由系统放入到应用程序的消息队列中,然后由应用程序取出并发送。
不进队消息在系统调用窗口过程时直接发送给窗口。
不论进队与否,消息最终都由系统调用窗口过程函数对消息进行处理。
1.4WinMain函数
WinMain函数是Windows程序的入口函数,当WinMain函数结束或返回时,Windows应用程序结束。
int WINAPI WinMain(
HINSTANCE hInstance,//程序当前运行的实例的句柄,这是一个数值
HINSTANCE hPrevInstance,//当前实例的前一个实例的句柄
LPSTR lpCmdLine,//指定传递给应用程序的命令行参数
int nCmdShow//指定窗口的显示方式
);
窗口的创建:1.设计窗口;2.注册窗口;3.创建窗口;4.显示窗口
设计窗口,Windows已经为我们定义好一个窗口应该具有的基本属性,我们只需要将要填充的部分填好窗口就设计好了。窗口的特征是通过结构体
WNDCLASS来定义的。
typedef structure _WNDCLASS{
UINT style;//指定这一类型窗口的样式
WNDPROC lpfnWndProc;//函数指针,指向窗口过程函数
int cbClsExtra;//Windows为系统中的每一个窗口类管理一个WNDCLASS结构
int cbWndExtra;//窗口附加内存
HANDLE hInstance;//指定包含窗口过程的程序的实例句柄
HICON hIcon;//指定窗口类的图标句柄
HCURSOR hCursor;//指定窗口类的光标句柄
HBRUSH hbrBackground;//指定窗口类的背景画刷句柄
LPCTSTR lpszMenuName;//一个以空终止的字符串,指定菜单资源的名字
LPCTSTR lpszClassName;//一个以空终止的字符串,指定窗口类的名字
}WNDCLASS;
注册窗口,窗口类(WNDCLASS)设计完后,需要调用RegisterClass函数进行注册。
ATOM RegisterClass(CONST WNDCLASS *lpWndClass);//*lpWndClass即窗口类对象的指针
创建窗口,设计并注册好窗口类之后,就可以用CreateWindow函数产生这种类型窗口。
HWND CreateWindow(
LPCTSTR lpClassName,//指定窗口类的名称
LPCTSTR lpWindowName,//指定窗口的名字
DWORD dwStyle,//指定创建的窗口的样式
int x,//窗口左上角的x坐标
int y,//窗口左上角的y坐标
int nWidth,//窗口的宽度
int nHeight,//窗口的高度
HWND hWndParent,//指定被创建窗口的父窗口句柄
HMENU hMenu,//指定窗口菜单的句柄
HANDLE hInstance,//指定窗口所属应用程序实例的句柄
LPVOID lpParam//作为WM_CREATE消息的附加参数lParam传入的数据指针
);
显示窗口,调用函数ShowWindow来显示窗口
BOOL ShowWindow(
HWND hWnd,//成功创建窗口后返回的窗口句柄
int nCmdShow//窗口的显示状态
);
更新窗口,调用ShowWindow函数后,我们调用UpdateWindow来刷新窗口
BOOL UpdateWindow(
HWND hWnd//创建成功后的窗口句柄
)
消息循环,在创建窗口、显示窗口、更新窗口后,我们需要编写一个消息循环,不断的从消息队列中取出消息并响应。
从消息队列中取出消息,我们调用GetMessage()函数
BOOL GetMessage(
LPMSG lpMsg,//指向一个消息(MSG)结构体,GetMessage从线程的消息队列中取出的消息信息将保存在该结构体对象中
HWND hWnd,//指定接受属于哪一个窗口的消息
UINT wMsgFilterMin,//指定要获取的消息的最小值
UINTwMsgFiletermax//指定要获取的消息的最大值,若min和max都设置为0,则接收所有消息
);
GetMessage函数接收到除WM_QUIT外的消息均返回非零值。
对于WM_QUIT消息,该函数返回零。
如果出现了错误,返回-1
Windows应用程序消息处理机制:(1)操作系统接受到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。(2)应用程序在消息循环中调用
GetMessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如放弃对某些消息的响应,或者调用
TranslateMessage产生新的消息。(3)应用程序调用DispatchMessage,将消息回传给操作系统。(4)系统利用WNDCLASS结构体的lpfnWndProc成员
保存的窗口过程函数的指针调用窗口过程,对消息进行处理。
窗口过程函数,用于处理发送给窗口的消息。一个Windows应用程序的主要代码部分就集中在窗口过程函数中。
LRESULT CALLBACK WindowProc(
HWND hwnd,//消息的窗口句柄
UINT uMsg,//消息代码
WPARAM wParam,//消息代码的附加参数
LPARAM lParam//消息代码的附加参数
);