事件:用户或者windows所产生的每一个动作
消息:用来详细描述每一个事件
typedef struct tagMSG {
HWND hwnd; //接受消息的句柄(那个窗口去响应这个消息)
UINT message; //消息的类型 应用程序使用低字,系统使用高字
WPARAM wParam; //关于消息具体信息,具体视消息类型而定
LPARAM lParam; //关于消息具体信息,具体视消息类型而定
DWORD time; //消息发布的事件
POINT pt; //消息发布时光标所在外置
} MSG, *PMSG, *LPMSG;
typedef struct tagPOINT {
LONG x; //光标所处位置的坐标信息
LONG y;
} POINT, *PPOINT;
过程解释:
1、系统或用户发出某个动作
2、系统将信息存储到MSG的结构体中
3、系统将该消息存储到相关应用程序的消息队列中
4、While(GetMessage(&Msg.null,0,0)) //从队列中获取消息
{
TranslateMessage(&Msg); //翻译消息
DispatchMessage(&Msg); //将消息分派到不同的窗口
}
5、DispatchMessage将加工的消息传递给操作系统
6、系统调用窗口过程函数
Win32应用项目创建过程:
1.添加窗口类名
typedef struct tagWNDCLASS {
UINT style; //窗口风格
WNDPROC lpfnWndProc; //过程函数的指针
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance; //应用程序的句柄(imagebase)
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground; //指定窗口的背景色
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName; //给窗口起一个名字
} WNDCLASS, *PWNDCLASS;
2. 注册窗口类
ATOM WINAPI RegisterClass(
_In_ const WNDCLASS *lpWndClass
);
RegisterClass(&wndclass);
3. 创建窗口
HWND WINAPI CreateWindow(
_In_opt_ LPCTSTR lpClassName, //创建窗口的类名
_In_opt_ LPCTSTR lpWindowName, //制定窗口名称
_In_ DWORD dwStyle, //窗口样式值的组合
_In_ int x, //
_In_ int y, //创建出窗口的位置
_In_ int nWidth, //
_In_ int nHeight, //创建窗口的宽高
_In_opt_ HWND hWndParent, //窗口所在父窗口的句柄
_In_opt_ HMENU hMenu, //菜单的句柄
_In_opt_ HINSTANCE hInstance, //所属应用程序的句柄
_In_opt_ LPVOID lpParam //附加数据一般为NULL
);
4、显示窗口
BOOL WINAPI ShowWindow(
_In_ HWND hWnd, //窗口句柄
_In_ int nCmdShow //显示方式
);
ShowWindow(hwnd,SW_SHOW);
5、消息循环
BOOL WINAPI GetMessage(
_Out_ LPMSG lpMsg, //指向从线程队列接受消息MSG构
_In_opt_ HWND hWnd, //要检索消息的窗口句柄
_In_ UINT wMsgFilterMin, //
_In_ UINT wMsgFilterMax //如果是0接受所有消息可能
);
MSG msg
While(GetMessage(&Msg.null,0,0)) //从队列中获取消息
{
TranslateMessage(&Msg); //翻译消息
DispatchMessage(&Msg); //将消息分派到不同的窗口
}
6、回调函数
每个消息必须返回处理结果return 0;
如果不是必要的(不是应用处理的)消息返回给windows处理
Return DefWindowProc(hwnd,UMasg,wPatm,lParam);
WM_COMMAND消息类型是windows提供的窗口类传递的消息类型:例如按钮窗口它会调用系统提供的winpoc然后转换为WM_COMMAND在调用父窗口的windowproc
/*
*定义过程函数
*LRESULT CALLBACK WindowProc
*/
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd, //窗口的句柄
_In_ UINT uMsg, //消息类型
_In_ WPARAM wParam, //消息的具体说明
_In_ LPARAM lParam
);
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
Switch(uMsg)
{
case WM_CREATE:
{
Return 0;
}
Case WM_MOVE:
{
Return 0;
}
Case WM_COMMAND:
{
Switch(LOWORD(wParam))
{
Case 子窗口编号(窗口的菜单句柄定义)
}
}
}
Return DefWindowProc(hwnd,UMasg,wPatm,lParam);
}
LOWORD(wParam) 菜单表示符。