Una implementación elegante del monitoreo de eventos de clic del mouse EasyX

Una implementación elegante del monitoreo de eventos de clic del mouse EasyX

Recientemente, el plan de estudios de la escuela requiere el uso de EasyX para implementar un juego pequeño o una aplicación pequeña. Pero ya sea un juego o una aplicación, es inevitable monitorear los clics del mouse, determinar dónde están los clics del mouse y responder en consecuencia.

Sí, este es un escenario muy simple y no es difícil lograrlo. Consulte los ejemplos dados por la escuela y algunas implementaciones que se encuentran en Internet para lidiar con esto, el código básico es el siguiente:

if (msg.uMsg==WM_LBUTTONDOWN) // 如果点左键
    {
        if((msg.x>110 && msg.x<360) && (msg.y>240 && msg.y<310))// 点击菜单1
            choose='1';
        if((msg.x>110 && msg.x<398) && (msg.y>325 && msg.y<390))// 点击菜单2
            choose='2';
        if((msg.x>110 && msg.x<458) && (msg.y>410 && msg.y<475))// 点击菜单3
            choose='3';
        if((msg.x>110 && msg.x<332) && (msg.y>500 && msg.y<550))// 点击菜单4
            choose='4';
    }

Cuando miré por primera vez, esto, ¿no es así? ¿Solo escríbelo así? ?
Inserte la descripción de la imagen aquí

¿Entonces puedo escribir 17 tarjetas como esta solo para Doudizhu? (Se puede simplificar con un bucle, pero todavía tengo un montón de botones distribuidos por todo el mundo), y usar if de esta manera definitivamente no es mi estilo. Entonces, me fui a la cama, después de todo, tengo todo en mis sueños.
Inserte la descripción de la imagen aquí

No, no lo hagas, retira el cuchillo ... ¡Deja de dormir, deja de dormir, nada de tareas difíciles, solo valientes sacrificios universitarios contemporáneos! Hazlo ...
Inserte la descripción de la imagen aquí
Primero, abstraemos las características comunes de todas las "cosas" en las que se puede hacer clic. Primero, se puede hacer clic y dibujar (dado que se puede dibujar, debe tener coordenadas x, y, longitud y ancho ) Esta clase es abstraída por nosotros.

class Clickable
{
public:
	int x;
	int y;
	int height;
	int width;
	void(*clickAction)();

	void receiveEvent(int cx, int cy);
	virtual void draw() = 0;
private:
	bool isClickMe(int cx, int cy);
};

Creo que x, y, altura y ancho no hace falta decirlo. En primer lugar,

  1. clickAction Este es un puntero de función, que es la acción que se realiza después de hacer clic en el control.
  2. ReceiveEvent es una función que se encarga de notificar al control dónde hizo clic el usuario
  3. isClickMe es una función privada, que es principalmente responsable de juzgar si el usuario hace clic en el control

La implementación específica es la siguiente:


void Clickable::receiveEvent(int cx, int cy)
{
	if (isClickMe(cx, cy))
	{
		clickAction();
	}

}


bool Clickable::isClickMe(int cx, int cy)
{
	return cx >= x && cy >= y && x + width >= cx && y + height >= cy;
}

A continuación, creamos una clase Button para heredarla e implementar la función de dibujo.

//-----Button.h----
#include "Clickable.h"
#include <graphics.h>		// 引用图形库头文件
#include <conio.h>

class Button: public Clickable
{
public:
	Button(int x, int y, int height, int width);
	void draw() override;
};
//------Button.cpp----
#include "Button.h"

Button::Button(int x, int y, int height, int width)
{
	this->x = x;
	this->y = y;
	this->height = height;
	this->width = width;
}

void Button::draw()
{
	fillrectangle(x, y,x + width, y + height);
}

Como puede ver, lo único que hace Button es dibujar un rectángulo con la función de dibujo implementada, nada especial. Aquí llega el momento más emocionante, ¡dibujémoslo en la función principal! ! !

#include "Button.h"
using namespace std;
//bt点击事件
void bt_clickAction() {
	setfillcolor(BLUE);
	fillcircle(100, 300, 25);
}
//bt2点击事件
void bt2_clickAction() {
	setfillcolor(RED);
	fillcircle(400, 300, 25);
}
int main()
{
    initgraph(640, 480);//初始化画布
    //创建两个Button 对象
    Button bt = Button(100, 100, 25, 60);
    Button bt2 = Button(400, 100, 25, 60);
    //为他们设置点击事件
    bt.clickAction = bt_clickAction;
    bt2.clickAction = bt2_clickAction;
    //把他们绘制到屏幕上
    bt.draw();
    bt2.draw();
	MOUSEMSG m;		// 定义鼠标消息
	while (true)
	{
		// 获取一条鼠标消息
		m = GetMouseMsg();
		switch (m.uMsg)
		{
		case WM_LBUTTONDOWN://按鼠标左键分发事件
			bt.receiveEvent(m.x, m.y);
			bt2.receiveEvent(m.x, m.y);
			break;
		case WM_RBUTTONUP:
			return 0;	// 按鼠标右键退出程序
		}
	}
	// 关闭图形窗口
	closegraph();
}

Los comentarios del código de arriba son muy claros y también resolvieron el problema que comenzamos (el problema de if desastre) .Puedes ver que no tengo un if en esta rama de WM_LBUTTONDOWN. Vamos a
Inserte la descripción de la imagen aquí
probarlo.
Inserte la descripción de la imagen aquí
Cuando hago clic en el botón de la izquierda,
Inserte la descripción de la imagen aquí
nace un ⚪ azul. Cuando hago clic en el botón de la derecha, es un ⚪ rojo
Inserte la descripción de la imagen aquí

Sin mencionar que el código ha cambiado, pero ¿probarías con 20 botones? Inserte la descripción de la imagen aquí
Terminé de escribir, se escapó ...

Supongo que te gusta

Origin blog.csdn.net/qq_36323419/article/details/115266521
Recomendado
Clasificación