//消息机制:产生消息(不可改变),传递消息(可以改变传递的方式(阻塞式与非阻塞式)),处理消息
//将用户事件转化为消息
产生消息
MSG msg;
//msg 结构体类
//{
//HWND hwnd;//窗口句柄
//UINT message;//消息id,传递过来的消息
//WPARAM wParam;//消息辅助参数
//LPARAM lParam;//消息辅助参数
//DWORD time;//消息产时间
//POINT pt;//消息产生时鼠标所在的位置
//}
传递消息
windows为每一个正运行的应用程序维护一个消息队列,所以应用程序只需要和自己对应的消息队列去接就OK了
GetMessage第3、4个参数叫做消息过滤,第3个参数指的是第一个消息,第4个参数指的是最后一个消息,这两个参数给0,表示任何消息(一般为两个参数给0,接受任何消息,处理放到后面)
GetMessage 从应用程序消息队列去得到消息,该函数为阻塞函数没有消息一直阻塞,当有消息时又分为两种情况
1、消息是WM_QUIT(退出),消息函数返回false;
2、当为非WM_QUIT时,函数返回true;
// 主消息循环: (阻塞函数)
/*while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}*/
//非阻塞函数
//PeekMessage从应用程序中得到消息(其过程大致为一段时间来取一次消息,不和GetMessage一样一直等着)
//其分为两种情况
//1、有消息返回true
//2、无消息返回false
ZeroMemory(&msg, sizeof(msg));//对内存进行清零相当于memset
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE));
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg));
{
TranslateMessage(&msg);//翻译消息
DispatchMessage(&msg);//投递消息
}
}
}
消息处理机制
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
//把消息的获取当成输入
switch (message)
{
//case WM_CREATE://创建窗口消息,理解为构造,这个消息窗口已经产生,在显示之前响应,这个消息由CreateWindow产生
case WM_ACTIVATE://窗口激活消息
switch (wParam)
{
case WA_CLICKACTIVE://鼠标激活
{
static int j = 0;
hdc=GetDC(hWnd);
TextOut(hdc, 0, j, _T("鼠标激活"), 4);
ReleaseDC(hWnd, hdc);
j += 20;
}
break;
case WA_ACTIVE://非鼠标激活
{
static int j = 0;
hdc = GetDC(hWnd);
TextOut(hdc, 200, j, _T("非鼠标激活"), 5);
ReleaseDC(hWnd, hdc);
j += 20;
}
break;
case WA_INACTIVE://取消窗口激活
{
static int j = 0;
hdc = GetDC(hWnd);
TextOut(hdc, 400, j, _T("取消窗口激活"), 4);
ReleaseDC(hWnd, hdc);
j += 20;
}
break;
}
case WM_LBUTTONDOWN:
{
//SendMessage(hWnd,WM_KEYDOWN,0,0);
//PostMessage(hWnd,WM_KEYDOWN,0,0);
Sleep(2000);
static int j = 0;
hdc = GetDC(hWnd);
TextOut(hdc, 0, j, _T("鼠标点击"), 4);
ReleaseDC(hWnd, hdc);
j += 20;
}
break;
case WM_KEYDOWN:
{
//发送消息(应用程序层面)
//插队,直接把消息发送给当前窗口的消息处理函数wndproc
//SendMessage(hWnd,WM_LBUTTONDOWN,0,0);
//排队,把消息发送到当前窗口的消息队列
PostMessage(hWnd, WM_LBUTTONDOWN, 0, 0);
Sleep(1000);//休眠
static int j = 0;
hdc = GetDC(hWnd);
TextOut(hdc, 200, j, _T("按键按下"), 4);
ReleaseDC(hWnd, hdc);
j += 20;
}
case WM_COMMAND://命令消息 菜单id都会在这里面
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);//销毁窗口(控制的是界面的退出按钮)
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT://gdi绘制消息
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY://销毁消息 理解为析构 可以由DestroyWindow函数来产生
PostQuitMessage(0);//post一个WM_QUIT消息
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}