温馨提示: 本内容还没有整理完毕
操作系统是怎么样将感知到的事件传递给应用程序的?这是通过消息机制来实现的。操作系统将每个事件都包装成一个成为消息的结构体MSG来传递给应用程序。
MSG的结构定义如下:
typedef struct tagMSG{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
}MSG;
HWND:窗口句柄,资源的标识。操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分为图标句柄(HICON),光标句柄(HCURSOR),
窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。
UINT:无符号的整型。message:传递消息,用整数来传递消息
WM_KEYDOWN是一个整型数据,宏定义。
WPARAM:一个整型数据,只是关于这个消息的附加信息。(character code(TCHAR))
lParam:一个整型数据,只是关于这个消息的附加信息。
DWORD:WORD是一个16位的整数,DWORD即DOUBLE WORD,32位整数。消息被传递出去的时间。
POINT:指示了一个光标的位置,当消息被传递时光标的位置。
消息队列:操作系统会给每个程序都建立一个消息队列先进先出的缓冲区,
WinMain函数
Windows
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPATR lpCmdLine, //指向字符串的一个长指针
int nCmdShow //指定程序的窗口是怎么的显示
);
窗口的创建:
创建一个完整的窗口需要经过下面四个操作步骤:
1:设计一个窗口类
typedef struct _WNDCLASS {
UINT style;// 窗口类型
WNDPROC lpfnWndProc;//窗口过程函数,指针
int cbClsExtra;//窗口扩展,默认设置为0
int cbWndExtra;//窗口实例扩展 ,通常设置为0
HINSTANCE hInstance;//实例句柄
HICON hIcon;//窗口的最小化图标(实质是一个句柄 )
HCURSOR hCursor;//窗口鼠标光标
HBRUSH hbrBackground;//窗口背景色
LPCTSTR lpszMenuName;//窗口菜单
LPCTSTR lpszClassName;// 窗口类名
} WNDCLASS, *LPWNDCLASS;
2:注册窗口类
RegisterClass(CONST WNDCLASS *lpWndClass);
3:创建窗口
HWND hwnd;
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hlnstance,
LPVOID lpParam //指针,在创建多文档,单文档的时候使用。
);
4:显示及更新窗口
ShowWindow(
HWND hwnd, //显示窗口的句柄
int nCmdShow //显示的状态
)
UpdateWindow(
HWND hwnd //显示窗口的句柄
)
消息循环
BOOL GetMessage{
LPMSG lpMsg, //消息结构体指针
HWND hWnd, //想要获取的窗口的句柄,如果设置位NULL,那就获取热河窗口
UINT wMsgFilterMin, //设定消息的最小值,最先的
UINT wMsgFilterMax //指消息的最大值,最后的
}//返回值为真,即是死循环。
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);//能够把按键按下转换为ASCII码(WM_KEYDOWM...)
DispatchMessage(&msg);//将收到的消息传到回调函数
}