Win32学习(第三天) Win32消息机制

//消息机制:产生消息(不可改变),传递消息(可以改变传递的方式(阻塞式与非阻塞式)),处理消息
//将用户事件转化为消息
产生消息

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41848597/article/details/88774621
今日推荐