Message 消息机制
MSG的结构如下所示: //是一个消息结构体
typedef struct tagMSG
{
HWND hwnd, //HWND是一个数据类型 窗口句柄
UINT message; //UINT无符号整型 是message的类型 message是一种整数的表示方式 Windows接收到的消息通过宏(WM_xxxx)来传递个message的 message是整型 数值不好记 所以传递给message的都是WM_xxxx宏来表示一个具体的消息
WAPARAM wParam;//WAPARAM实际是一个整数(整型) 指示了一个消息的附加参数
LPARAM lParam; //LPARAM实际也是一个整数(整型) 。 。 。 。 。 。 。 。
DWORD time; //32位的一个整数 指消息被传递出去的时间
POINT pt; //POINT是一个点的结构体 实际上是定义了一个x,y坐标 点是pt 当消息被投递的时候 光标在屏幕上的一个位置
}MSG;
=================================================================================================================================================================================================================================
Windows程序的入口函数 WinMain函数
int WINAPI WinMain(
HINSTANCE hInstance, //指一个应用程序的句柄 这个句柄叫实例句柄 指当前运行的一个实例句柄
HINSTANCE hPrevInstance, //也是一个句柄 指先前一个实例的句柄 基于Win32的程序 此参数总为空NULL
LPSTR lpCmdLine, //凡LP开头都为指针类型 LPSTR指向字符串地址的一个指针 lpCmdLine程序运行时的命令行参数
int iCmdShow // 程序运行时的显示方式,如最大化、最小化、隐藏显示等
)
=================================================================================================================================
创建窗口的四个步骤SDK,1设计窗口类,2注册窗口类,3创建窗口,4显示及更新窗口
1设计窗口就是设计一个窗口类 也是一个结构体
窗口类WNDCLASS
设计窗口类
typcdcf struct_WNDCLASS{
UINT style; //style指定一个类的类型 参照MSDN 或附件1 类的类型
WNDPROC lpfnWndProc; //WNDPROC窗口过程一个类型 lpfnWndProc接收一个函数指针,指定窗口的一个回调函数
int cbClsExtra; //通常用不到一般设为 0
int cbWndExtra; //。。。。。。。。。 0
HANDLE hInstance; //代表当前应用程序实例号
HICON hIcon; //图标句柄 用 LoadIcon()函数赋值 参照MSDN 或附件2 LoadIcon的图标标识符
HCURSOR hCursor; //光标句柄 用 LoadCursor()函数赋值 参照MSDN或附件3 LoadCursor()
HBRUSH hbrBackground; //画笔句柄 用 GetStockObject()函数赋值 参照MSDN或附件4 GetStockObject()的库存对象标识符
LPCTSTR lpszMenuName; //设置一个窗口菜单 无菜单设置为 NULL
LPCTSTR lpszClassName; //为整个一个窗口起个名字 注意:并不是标题栏的名字 例:wndclass.lpszClassName="bailang";
}WNDCLASS;
2注册窗口类
RegisterClass(&窗口类名);
3创建窗口
HWND hwnd; //定义窗口句柄 用这个窗口句柄来存储窗口标识
通过CreateWindow函数实现
CreateWindow()函数的原型:
HWND CreateWindow(
LPCTSTR lpClassName, //这是你所创建的窗口的基础类名——例如“WINCLASS-1”
LPCTSTR lpWindowName,//窗口标题栏的名字
DWORD dwStyle, //说明窗口外观和行为的通用窗口标志 参照附件5 dwStyle的通用类型值
int x, //x,y——这是该窗口左上角位置的像素坐标。如果你无所谓,可使用CW_USEDEFAULT,这将由Windows来决定
int y, //同上 若X为CW_USEDEFAULT 那么Y将被忽略
int nWidth, //nWidth,nHeight——这是以像素表示的窗口宽度和高度。如果你无所谓,可使用CW_USEDEFAULT,这将由Window来决定
int nHeight, //同上 若nWidth为CW_USEDEFAULT 那么nHeight将被忽略
HWND hWndParent, //假如父窗口存在,这是指向父窗口的句柄。如果没有父窗口,值为NULL
HMENU hMenu, //这是指向菜单的句柄。下一章中将详细介绍,现在将其赋值NULL
HINSTANCE hInstance, //这是应用程序实例,这里从WinMain()中使用实例
LPVOID lpParam //高级特征,设置为NULL
);
4显示窗口
ShowWindow(hwnd,SW_SHOWNORMAL); //显示窗口的状态 参照 附件6 ShowWindow 指定窗口的显示状态
UpdateWindow(); //更新窗口
======================================================================================================
消息循环
MSG msg; //MSG结构体定义了一个消息结构体的一个变量
while(GetMessage(&msg,NULL,0,0)) //GetMessage从消息队列中获取消息 参照附件7 GetMessage原型
{
TranslateMessage(&msg); //转换、翻译消息 对取到的消息对进行转换 然后将转换后的消息投递到消息队列中 再有GetMessage获取消息
DispatchMessage(&msg); //将收到的消息传递出去给OS 然后OS再调用回调函数lpfnWndProc(窗口过程函数)
}
==========================================================================================================
回调函数的原型
LRESULT CALLBACK WindowProc(
WHND hwnd, //window handle of sender
UINT msg, //the message id
WPARAM wparam, //further defines message
LPARAM lparam //further defines message
);
//这4个参数和MSG的结构前4个参数是一样的