这是你的代码逻辑有错。
首先,你代码里面的部分代码与逻辑无关,比如批量绘图,我们先删掉。同时,也没有必要使用 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;
}