修改GLFW源码增加菜单栏按钮响应功能

上一篇GLFW获取HWND和添加菜单栏方法中写了如何在GLFW中获取窗口句柄,并添加菜单栏。但此时添加的菜单栏只能看,点了并没有反应。而GLFW也没有提供检测菜单栏按钮的方法。如果要GLFW相应菜单栏按钮的话,只能修改源码了。

思路是这样的:GLFW中有一个glfwSetFramebufferSizeCallback(window, framebuffer_size_callback)函数,用于帧缓冲大小变化时调用指定的回调函数。而通过在glfwGetWin32Window(window)函数中下断点,跟踪进入GLFW源码中win32_window.c,可以看到static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)函数,这是标准的windows消息处理函数啊。这样就可以修改源码,为GLFW增加一个回调注册函数,再在windowProc中增加WM_COMMAND消息的处理,在消息中调用注册的回调函数,达到响应菜单栏按钮的目的。

第1步 在GLFWwindow结构体中增加回调函数指针成员变量

找到365行:

struct _GLFWwindow
{

往下翻,增加如图所示一行:
在这里插入图片描述

第2步 定义回调函数类型

现在它还不认识GLFWwindowcomandfun类型,这是我们定义的响应WM_COMMAND消息的函数指针类型,接下来我们在glfw3.h中声明:
在这里插入图片描述
这里我们定义了一个函数指针类型,它的返回值类型是void,参数类型是WPARAM和LPARAM。

第3步 声明回调函数注册函数

同样是在glfw3.h中,我们加入:
在这里插入图片描述
现在,注册回调函数的函数的声明有了,还需要定义。

第4步 定义回调函数注册函数

找到window.c,加入:

GLFWAPI GLFWwindowcommandfun glfwSetWindowCommandCallback(GLFWwindow *handle, GLFWwindowcommandfun windowCommandFun)
{
	_GLFWwindow *window = (_GLFWwindow *)handle;
	assert(window != NULL);

	_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
	window->callbacks.cmd = windowCommandFun;
	return windowCommandFun;
}

如图:
在这里插入图片描述
关键的一句就是window->callbacks.cmd = windowCommandFun,这句的作用是把参数中的回调函数指针赋值给window结构体内callbacks结构体内的cmd成员,这是我们在第一步中定义的。

第5步 修改windowProc消息处理函数以响应WM_COMMAND消息

打开win32_window.c,找到windowProc函数。找到第468行 switch (uMsg) 部分,这里是各个消息的处理过程,翻动,我们发现WM_LMOUSEDOWN、WM_KEYDOWN等消息都处理了,唯独WM_COMMAND没有,这也是为什么我们之前加入了Menu但点击没有反应的原因。在 switch (uMsg)下加入:

		case WM_COMMAND:
		{
			if (window->callbacks.cmd != NULL)
				window->callbacks.cmd(wParam, lParam);

			return 0;
		}

在这里插入图片描述
意思很简单了,如果window->callbacks.cmd已赋值,那么就按照函数指针调用赋值的这个函数。

第6步 重新编译GLFW

编译GLFW,得到glfw3.lib。我们自己的程序的include目录部分不用修改,因为之前我们修改GLFW源码时,源码中的各个.h文件就是GLFW的include目录里的,已经修改过了。

第7步 在程序中设置回调函数指针

在GLFW的消息循环之前,加入:

	glfwSetWindowCommandCallback(window, commandFun);

第8步 定义WM_COMMAND消息的处理函数

在主函数外定义处理WM_COMMAND消息的函数:

void commandFun(WPARAM wParam, LPARAM lParam)
{
	WORD id = LOWORD(wParam);
	if (id == ID_FILE_NEW)
		MessageBox(NULL, "You pressed the New menu button.", "", MB_OK);
}

ID_FILE_NEW是在资源的菜单栏中定义的按钮ID。

达到效果。
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值