举报

关于鼠标信息有延迟的问题

0

最近在做一个课设,在设计一个操作:当鼠标左键点击时,触发一次事件

但实际当左键点击一次时,会重复触发较多次该事件,特别是当左键一直处于按下状态时,事件会一直重复触发

所以我想请教一下,如何才能做到,当鼠标左键按下时,无论是否抬起,都只触发一次事件?

下面是我的代码:

while (1)
{
	BeginBatchDraw();

	putimage(0, 0, &game_background);

	while (MouseHit())
	{
		m = GetMouseMsg();
	}

	if (m.uMsg == WM_LBUTTONDOWN)
	{
		happen();//事件发生
	}


	FlushMouseMsgBuffer();

	FlushBatchDraw();
}
ava
木辛

2020-5-3

举报
2

这是你的代码逻辑有错。

首先,你代码里面的部分代码与逻辑无关,比如批量绘图,我们先删掉。同时,也没有必要使用 FlushMouseMsgBuffer(),删掉。留下的可以编译的代码如下(仍然有问题):

// 仍然有问题的代码
#include <graphics.h>
#include <stdio.h>

int main()
{
	// 创建图形窗口
	initgraph(640, 480, EW_SHOWCONSOLE);

	MOUSEMSG m = GetMouseMsg();
	while (1)
	{
		while (MouseHit())
		{
			m = GetMouseMsg();
		}

		if (m.uMsg == WM_LBUTTONDOWN)
		{
			printf("LBTN ");
		}
	}

	// 关闭绘图窗口
	closegraph();
	return 0;
}

上面代码的问题和你描述的一致,按下鼠标左键后会“重复触发WM_LBUTTONDOWN”。

问题原因是:

当你按下左键后,m 的值为左键按下消息。而下一次的 while 循环,m 的值仍然不变,所以还会执行 printf("LBTN "),并且每次循环都输出,直到遇到下一个鼠标事件,例如左键弹起。

解决办法,只有 MouseHit() 的时候才进行鼠标事件的判断,范例:

#include <graphics.h>
#include <stdio.h>

int main()
{
	// 创建图形窗口
	initgraph(640, 480, EW_SHOWCONSOLE);

	MOUSEMSG m = GetMouseMsg();
	while (1)
	{
		while (MouseHit())
		{
			m = GetMouseMsg();
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				printf("LBTN ");
			}
		}

		Sleep(10);
	}

	// 关闭绘图窗口
	closegraph();
	return 0;
}
ava
慢羊羊

2020-5-4

非常感谢! -  木辛  2020-5-12
举报
技术讨论社区