windows API:
当我们在写程序时,经常会用到一些库函数来辅助完成某些功能,比如C库函数中的printf函数,或者C++中的cout函数,但是这些函数都是你所使用的编译器厂商提供的,在windows平台下,也有类似的函数可供调用,这些函数式由windows系统本身提供的。(PS:这些函数就是windows API)
窗口与句柄:
在windows程序中,窗口是通过窗口句柄(HWND)来标识的。我们如果要对某个窗口调用就首先要先得到这个窗口的句柄。因为在windows程序中,有各种各样的资源(窗口,图标,光标等等),系统在创建这些资源的时候会为他们分配内存,并且返回标识这些资源的标识号,即句柄。(注意句柄都是以H开头的)
消息与消息队列:
在windows程序中,它是一种事件驱动方式的程序设计(PS:DOS是顺序的、关联的、过程驱动的设计方式),主要是基于消息的。因此操作系统会调用程序的一个专门负责处理消息的函数,这个函数为一个窗口过程。
消息的结构:
typedef struct tagMSG
{
HWND hwnd;//消息所属的窗口
UINT message;//消息的标识符,用数值来标识,不同数值代表不同消息
WPARAM wParam;
LPARAM lParam;
DWORD time;//消息投递到消息队列时间
POINT pt;//鼠标当前位置
}
消息队列:
每当一个windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息。
而应用程序依靠一个消息循环不断地从消息队列中取出消息,并进行相应。
Windows程序的实现步骤:
1、WinMain函数定义
2、创建一个窗口
3、进行消息循环
4、编写窗口过程函数
WinMain函数的定义声明:
int WINAPI WinMain //注意修饰符WINAPI作用:_stdcall 函数调用约定
(
HINSTANCE hInstance,//表示该程序当前运行的实例的句柄,这是一个数值
HINSTANCE hPrevInstance,//表示当前实例的前一个实例的句柄
LPSTR lpCmdLine,//一个以空终止的字符串
int nCmdShow//指定程序的窗口应该如何显示
)
窗口的创建:
具体步骤如下:
1、设计一个窗口类
2、注册窗口类
3、创建窗口
4、显示及更新窗口
设计窗口中WNDCLASS结构体:
typedef struct _WNDCLASS{
UINT style;//指定这一个类型窗口的样式(PS:这是一个枚举类型)
WNDPROC lpfnWndProc;//函数指针,指向窗口过程函数
int cbClsExtra;//Windows会为每个窗口类管理一个WNDCLASS结构
int cbWndExtra;
HANDLE hInstance;//指定包含窗口过程的实例句柄
HICON hIcon;//指定窗口类的图标句柄
HCURSOR hCursor;//窗口类的光标句柄
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
}WNDCLASS;
创建窗口:
CreateWindows函数的原型声明:
HWND CreateWindow(
LPCTSTR lpClassName,//指定窗口类的名称
LPCTSTR lpWindowName,//指定窗口名称
DWORD dwStyle,//创建窗口的样式(枚举)
int x,//水平位子
int y,//垂直位置
int nWidth,
int nHeight,
HWND hWndParent,//父窗口句柄
HMENU hMenu,//窗口菜单句柄
HANDLE hInstance,//窗口所属的应用程序实例的句柄
LPVOID lpParam
);
如果窗口创建成功,CreateWindow函数将返回系统为该窗口分配的句柄,否则返回NULL。
显示以及跟新窗口:
(1)显示窗口:调用ShowWindow来显示
ShowWindow的函数声明如下:
BOOL ShowWindow(
HWND hWnd,//窗口的句柄
int nCmdShow//指定了窗口的显示状态(枚举)
);
(2)跟新窗口:调用UpdataWindows
UpdataWindows函数原型声明入下:
BOOL UpdataWindo(
HWND hWnd//跟新窗口的句柄
);
消息循环
在创建窗口、显示窗口、更新窗口以后,需要一个消息循环,不断从消息队列中取出消息,并进行响应。
要从消息队列中取出消息,我们需要调用GetMessage()函数,具体声明如下:
BOOL GetMessage(
LPMSG lpMsg,//表示一个指向MSG结构体的指针,GetMessage从线程的消息队列中取出的消息信息保存在结构体对象中
HWND hWnd,//指定接受属于哪个窗口的消息
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
PS:在消息循环中用到TranslateMessage():用于将虚拟按键消息转化为字符消息。