环境: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;
}