Windows API一日一练(10-12)GetMessage TranslateMessage DispatchMessage函数

主目录传送门

https://blog.csdn.net/zb774095236/article/details/108291755

本次学习的源码模板下载:

1、https://pan.baidu.com/s/1uo0NaiAfdeC6FFw4lqhf3A  提取码:y8ju

重大改变:

在看了几篇后续我决定自己重新整理一下流程,但是所涉及的函数不会丢掉

学习目标:

在上期的基础源码版本上本次我们将会得到一个不会消失的窗口你可以尝试拖动它 并改变大小了

 


学习内容:

一、 项目参考  

新增函数解释 GetMessage TranslateMessage DispatchMessage

1. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getmessagea   Microsoft官方函数文档

2. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-translatemessage Microsoft官方函数文档

3.https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-dispatchmessage Microsoft官方函数文档

4. https://docs.microsoft.com/en-us/windows/win32/winmsg/using-messages-and-message-queues Microsoft创建消息队列文档

5. https://blog.csdn.net/caimouse/article/details/1699890   大牛的Win32系列

6.https://blog.csdn.net/caimouse/article/details/1702420    大牛的Win32系列

7.https://blog.csdn.net/caimouse/article/details/1704627   大牛的Win32系列

二. 在往期模板上修改和新增的步骤
1.代码段

//库文件
#include "Windows.h"
#include "tchar.h"



LRESULT CALLBACK MainWndProc(
	HWND hwnd,        // handle to window 
	UINT uMsg,        // message identifier
	WPARAM wParam,    // first message parameter
	LPARAM lParam)    // second message parameter
{


	switch (uMsg)
	{
	case WM_CREATE:
		// Initialize the window. 
		return 0;

	case WM_PAINT:
		// Paint the window's client area. 
		return 0;

	case WM_SIZE:
		// Set the size and position of the window. 
		return 0;

	case WM_DESTROY:
		// Clean up window-specific data objects. 
		return 0;
      
		// 
		// Process other messages. 
		// 

	default:
		return DefWindowProc(hwnd, uMsg, wParam, lParam);//系统的默认消息处理函数
	}
	return 0;
}




//定义WinMain的入口
int APIENTRY _tWinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR    lpCmdLine,
	int       nCmdShow)
{

	//没有这些参数也不会发生警告
	//UNREFERENCED_PARAMETER(hInstance);
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);
	//UNREFERENCED_PARAMETER(nCmdShow);




	
	WNDCLASS wc; //创建窗口类对象

	//对窗口类的各属性进行初始化
	wc.style = CS_HREDRAW | CS_VREDRAW; /*窗口类的风格,CS前缀,C表示Class,S表示
											  Style,这里使用了水平和垂直风格*/
	wc.lpfnWndProc = MainWndProc;  /*这里将回到函数的名字赋值用以windows后面回调*/
	wc.cbClsExtra = 0;  //附加参数,通常情况下为0
	wc.cbWndExtra = 0;  //附加参数,通常情况下为0
	wc.hInstance = hInstance;  //窗口句柄,这里将WinMain中的hInstance句柄赋值就可
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /*窗口图标,LoadIcon()是加载图标,这里是加载一个系统资源图标,LoadIcon()的原型是HICON LoadIcon(HINSTANCE, LPCSTR);*/
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);  /*加载鼠标,同上相似*/
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  /*窗口画刷,这里是使用的白色画刷,所以创建出来的窗口的背景颜色则是白色的*/
	wc.lpszMenuName = _T("MainMenu"); //窗口菜单名称,这里没有菜单,设为NULL
	wc.lpszClassName = _T("MainWindowClass");  //窗口类名称,这个窗口类名称可作为这个窗口的唯一标识

	/*注册窗口类*/
	if (!RegisterClass(&wc))
	{
		//注册窗口类失败时,弹出提示
		MessageBox(NULL, TEXT("This program requires Window NT!"), _T("MainWindowClass"), MB_ICONERROR);
		return FALSE;
	}

	/*创建窗口
	HWND CreateWindow(
	LPCTSTR lpClassName,  //窗口类名
	LPCTSTR lpWindowName, //窗口标题
	DWORD dwStyle,        //窗口风格,WS开头
	int x,                //窗口左上角x坐标
	int y,                //窗口左上角y坐标
	int nWidth,           //窗口宽度
	int nHeight,          //窗口高度
	HWND hWndParent,      //父窗口句柄
	HMENU hMenu,          //菜单句柄
	HANDLE hlnstance,     //窗口句柄
	LPVOID lpParam);      //改值会传递给窗口WM_CREATE消息的一个参数
	*/
	HWND hwnd;    //创建窗口函数CreateWindow()会返回一个HWND句柄,这里定义下,用来接收这个句柄
	hwnd = CreateWindow(_T("MainWindowClass"),    //窗口类名
		TEXT(" Hello Win32API"),    //窗口标题,会在窗口的左上角标题栏显示
		WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, //窗口风格
		CW_USEDEFAULT,  //窗口左上角x位置,这里使用的系统默认值,可自定义
		CW_USEDEFAULT,  //窗口左上角y位置
		CW_USEDEFAULT,  //窗口的宽度
		CW_USEDEFAULT,  //窗口的高度
		NULL, //该窗口的父窗口或所有者窗口的句柄,这里用不到,设为NULL
		NULL, //窗口菜单句柄,这里没有菜单,设置为NULL
		hInstance, //窗口句柄
		NULL  //传递给窗口WM_CREATE消息的一个参数,这里不用,设置为NULL
		);

	/*显示窗口,显示方式使用WinMain的参数*/
	ShowWindow(hwnd, nCmdShow);
	/*更新窗口*/
	UpdateWindow(hwnd);

#if 1 //新增段
	MSG msg;
	// 主消息循环:
	while (GetMessage(&msg, nullptr, 0, 0))
	{

		TranslateMessage(&msg);
		DispatchMessage(&msg);

	}
#endif
	return 0;

}

项目下载地址:

1.百度云:https://pan.baidu.com/s/1wYX_ntAktu6XdXKzKmZw-g 提取码:no24

留在最后

加油加油将窗口更加完善

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 消息机制是 Windows 操作系统中非常重要的一个机制,它负责处理所有发往窗口的消息。下面我将详细介绍 Windows 消息机制的相关内容。 Win32程序消息获取流程: 1. 获取消息:应用程序可以使用 PeekMessage 函数或 GetMessage 函数从消息队列中获取消息。 2. 翻译消息:如果获取到的消息是键盘或鼠标输入消息,那么需要使用 TranslateMessage 函数将其转换为字符消息。 3. 分发消息:使用 DispatchMessage 函数将消息分发给对应的窗口过程函数进行处理。 PeekMessage 函数: PeekMessage 函数可以从消息队列中获取消息,但不会将消息从队列中移除。如果队列中没有消息,该函数会立即返回 FALSE。PeekMessage 函数的基本语法如下: ```C++ BOOL PeekMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ); ``` GetMessage 函数: GetMessage 函数可以从消息队列中获取消息,并将消息从队列中移除。如果队列中没有消息,该函数会将线程挂起,直到有消息到达。GetMessage 函数的基本语法如下: ```C++ BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax ); ``` TranslateMessage 函数TranslateMessage 函数用于将键盘或鼠标输入消息转换为字符消息。如果获取到的消息是键盘或鼠标输入消息,那么需要使用 TranslateMessage 函数将其转换为字符消息。TranslateMessage 函数的基本语法如下: ```C++ BOOL TranslateMessage( const MSG *lpMsg ); ``` DispatchMessage 函数DispatchMessage 函数用于将消息分发给对应的窗口过程函数进行处理。如果获取到的消息是字符消息,那么将会调用窗口过程函数,否则将会调用 DefWindowProc 函数进行处理。DispatchMessage 函数的基本语法如下: ```C++ LRESULT DispatchMessage( const MSG *lpMsg ); ``` PostMessage 函数: PostMessage 函数用于向消息队列中添加消息。该函数并不会等待消息被处理完毕,而是立即返回。PostMessage 函数的基本语法如下: ```C++ BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); ``` SendMessage 函数: SendMessage 函数用于向指定的窗口发送消息,该函数会等待消息被处理完毕才返回。SendMessage 函数的基本语法如下: ```C++ LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); ``` 关系说明: PeekMessage 和 GetMessage 函数用于获取消息,TranslateMessage 函数用于将键盘或鼠标输入消息转换为字符消息,DispatchMessage 函数用于将消息分发给对应的窗口过程函数进行处理。PostMessage 函数用于向消息队列中添加消息,SendMessage 函数用于向指定的窗口发送消息。这些函数之间的关系是相互独立的,但结合起来可以构成完整的消息处理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值