举报

EasyX处理鼠标事件(反应迟钝)

0

环境:VC2022+EasyX

类封装的按钮功能,希望能实现鼠标左键松开执行一次事件,用bool变量isLeftButtonUp判断是否重复执行(不然点一次鼠标会执行好多次,不知道有没有其他能够避免这种情况的写法)。

但在实际运行时,刚运行会迟钝很久(推测是消息缓冲区有大量鼠标移动信息),连续点击正常,但是点一次后移动一会鼠标再点一次也会进入好几秒的延迟。

想请教一下该如何修改:

①有其他能判断左键松开一次执行一次事件的写法吗?

②如何解决这个鼠标处理的延迟,实现响应及时的“鼠标左键松开执行一次事件”?

//省流版代码

class PushButton//按钮类
{
public:
	PushButton();
	PushButton(const string text, int x = 0, int y = 0, int w = 100, int h = 30);
	void show();
	void move(int x,int y);

	bool isIn();//判断鼠标是否在按钮上
	bool isClicked();//判断是否点击
	void Update();//事件循环/更新鼠标
private:
	string text;
	int x, y, w, h;
	COLORREF color = RGB(51, 51, 51);
	MOUSEMSG msg;
	bool isLeftButtonUp = false;
};

bool PushButton::isIn()//判断鼠标是否在按钮范围内
{
	if (msg.x >= x && msg.x <= x + w && msg.y >= y && msg.y <= y + h) {
		return true;
	}
	return false;
}

bool PushButton::isClicked()//判断是否被点击(左键松开)
{
	if (isIn()) {
		if (msg.uMsg == WM_LBUTTONUP&&!isLeftButtonUp) {
			isLeftButtonUp = true;
			return true;
		}
		else if (msg.uMsg == WM_LBUTTONDOWN)isLeftButtonUp = false;//isLeftButtonUp变量用来防止在一次左键松开下重复进入事件
	}
	return false;
}

int main(){
	//省略初始化窗体和按钮
	int i = 0;
	while (true) {
		if (MouseHit()) p.Update();
		if (p.isClicked()) {
			outtextxy(0, i*35, "is clicked!");
			i++;
		}
		Sleep(100);
	return 0;
}
//以下是较完整代码(删掉了窗体类)
#include"games.h"
#include"Window.h"
#include"PushButton.h"

//定义初始化数据
#define win_width 1280
#define win_height 720

class PushButton
{
public:
	PushButton();
	PushButton(const string text, int x = 0, int y = 0, int w = 100, int h = 30);
	void show();
	void move(int x,int y);

	bool isIn();//判断鼠标是否在按钮上
	bool isClicked();//判断是否点击
	void Update();//事件循环/更新鼠标
private:
	string text;
	int x, y, w, h;
	COLORREF color = RGB(51, 51, 51);
	MOUSEMSG msg;
	bool isLeftButtonUp = false;
};

PushButton::PushButton(const string text, int x, int y, int w, int h):text(text),x(x),y(y),w(w),h(w)
{
}

void PushButton::show()
{
	setfillcolor(color);
	fillroundrect(x, y, x + w, y + h, 10, 10);//绘制圆角矩形
	setbkmode(TRANSPARENT);
	outtextxy(x+(w-textwidth(text.c_str()))/2, y+ (h - textheight(text.c_str())) /2, text.c_str());//居中显示文字
}

void PushButton::move(int x, int y)
{
	this->x = x;
	this->y = y;
}

bool PushButton::isIn()//判断鼠标是否在按钮上
{
	if (msg.x >= x && msg.x <= x + w && msg.y >= y && msg.y <= y + h) {
		return true;
	}
	return false;
}

bool PushButton::isClicked()//左键松开
{
	if (isIn()) {
		if (msg.uMsg == WM_LBUTTONUP&&!isLeftButtonUp) {
			isLeftButtonUp = true;
			return true;
		}
		else if (msg.uMsg == WM_LBUTTONDOWN)isLeftButtonUp = false;
	}
	return false;
}

void PushButton::Update()
{
	msg = GetMouseMsg();
	//peekmessage(&msg, EM_MOUSE);
}

int main() {
	Window w(win_width, win_height);
	PushButton p;

	w.SetTitle("最终幻想XVII");
	p.move(win_width / 2-10, win_height / 2-5);p.show();

	int i = 0;
	while (true) {//问题代码段
		if (MouseHit()) p.Update();
		if (p.isClicked()) {
			outtextxy(0, i*35, "is clicked!");
			i++;
		}
		Sleep(100);
	}

	_getch();
	closegraph();
	return 0;
}
悬赏金额:¥5元

1. 回答问题后,可以看到提问者联系方式。

2. 如果对问题有不明确的地方,可以在回复中写下你的疑问,就可以看到提问者的联系方式,然后详细沟通。

3. 如果私下沟通解决了问题,建议回答者将解决方案补充到本站,提问者勾选正确答案。每个人回答的问题数量,是能力的象征。

4. 回答问题后,可以通过提问者的联系方式私下协商领取悬赏的方式,本站不做任何干涉,不做担保,不抽取佣金,请双方谨慎操作。

举报
0

针对你的问题的解决方案:https://codebus.cn/zhaoh/handle-mouse-messages-correctly

ava
慢羊羊

2023-7-15

举报
0

while (true)

{

bool Active = peekmessage(...);

if (!Active) break;

if (... == ...)
{

flushmessage();

break;

}

};

ava
o伸

2024-9-14

技术讨论社区