EasyX的学习2

消息处理------漂亮的按钮(鼠标)

用到的函数

**1.消息结构体变量类型:**使用ExMessage

复制代码
ExMessage msg{ 0 };

定义一个变量名为msg的ExMessage结构体变量并初始化为0

**2.获取消息函数:**peekmessage函数

复制代码
//获取消息
peekmessage(&msg, EX_MOUSE);

两个参数 1.代表获取位置,2。代表类型(EX_MOUSE代表鼠标;EX_KEY代表键盘)

3.双缓冲绘图: BeginBatchDraw()和EndBatchDraw()(所有的绘图代码必须放在begin和end之间)

使用鼠标操作需要在窗口函数initgraph第三个参数加上EX_DBLCLKS

复制代码
initgraph(640, 480, EX_SHOWCONSOLE || EX_DBLCLKS);

制作鼠标按钮总代码

复制代码
#include<stdio.h>
#include<graphics.h>

//定义消息结构体变量
ExMessage msg{ 0 };

//mx,my是否在指定的矩形区域
bool inarea(int mx, int my, int x, int y, int w, int h)
{
	if (mx > x && mx<x + w && my>y && my < y + h)
		return true;
	return false;
}

bool button(int x, int y, int w, int h, const char* text)
{
	//绘制按钮颜色
	if (inarea(msg.x, msg.y, x, y, w, h))//鼠标在按钮内的颜色
		setfillcolor(RGB(93, 107, 153));
	else
		setfillcolor(RGB(230, 231, 232));//鼠标在按钮外的颜色

	fillroundrect(x, y, x + w, y + h, 8, 8);//制作圆角矩形

	//绘制按钮文本
	int hspace = (w - textwidth(text)) / 2;
	int vspace = (h - textheight(text)) / 2;
	outtextxy(x + hspace, y + vspace, text);

	//判断按钮是否被点击
	if (msg.message == WM_LBUTTONDOWN && inarea(msg.x, msg.y, x, y, w, h))
		return true;
	return false;
}

int main()
{
	//创建一个图形窗口函数 宽度+高度
	initgraph(640, 480, EX_SHOWCONSOLE || EX_DBLCLKS);

	//设置窗口的颜色使用:setbkcolor
	setbkcolor(RGB(67, 210, 255));//RGB三原色

	//用设置的背景颜色填充整个窗口
	cleardevice();

	//设置背景模式
	setbkmode(TRANSPARENT);

	while (true)
	{
		//获取消息
		peekmessage(&msg, EX_MOUSE);

		//双缓冲绘图:所有的绘图代码必须放在begin和end之间
		BeginBatchDraw();
		cleardevice();//清屏

		if (button(20, 20, 150, 35, "start game!"))
		{
			printf("start game!\n");
		}
		if (button(300, 20, 150, 35, "end game!"))
		{
			printf("end game!\n");
		}
		EndBatchDraw();

		//把消息类型设置为0
		msg.message = 0;
	}

	//防止程序退出
	Sleep(100000);
	return 0;
}

鼠标在按钮外的样子

鼠标在按钮内的样子

可以设置鼠标左右键执行不同的操作

复制代码
	while (true)
	{
		//获取消息
		if (peekmessage(&msg, EX_MOUSE))//bool类型
		{
			switch (msg.message)
			{
			case WM_LBUTTONDOWN:	//左键按下
				printf("鼠标左键按下\n");
				break;
			case WM_RBUTTONDOWN:	//右键按下
				printf("右键按下 pos(%d,%d)\n", msg.x, msg.y);//输出鼠标点击的坐标
				break;
			case WM_MBUTTONDOWN:	//中键按下
				printf("中键按下\n");
				break;
			case WM_MOUSEWHEEL:     //滚轮滚动
				printf("滚轮滚动 dir(%d)\n", msg.wheel);//屏幕方向为正120
				break;
			case WM_LBUTTONDBLCLK:	//左键双击
				printf("左键双击\n");
				break;
			case WM_MOUSEMOVE:		//鼠标移动
				//printf("鼠标移动\n");
				break;
			}
		}
	}

msg.message是结构体内的一个成员

消息处理------按键消息

复制代码
#include<stdio.h>
#include<graphics.h>

//定义消息结构体变量
ExMessage msg{ 0 };

int main()
{
	//创建一个图形窗口函数 宽度+高度
	initgraph(640, 480, EX_DBLCLKS);

	//设置窗口的颜色使用:setbkcolor
	setbkcolor(RGB(67, 210, 255));//RGB三原色

	//用设置的背景颜色填充整个窗口
	cleardevice();

	//定义小球属性
	int x = 50, y = 50, r = 24;

	int speed = 4;//小球移动速度
	int vx = 0;//小球变化方向
	int vy = 0;//小球变化方向
	while (true)
	{
		//获取消息
		peekmessage(&msg, EX_KEY);
		//判断按键消息
		if (msg.message == WM_KEYDOWN)
		{
			//具体判断是哪个键按下
			switch (msg.vkcode)
			{
			case VK_UP:		//上键按下
				vy = -1;
				break;
			case VK_DOWN:	//下键按下
				vy = 1;
				break;
			case VK_LEFT:	//左键按下
				vx = -1;
				break;
			case VK_RIGHT:	//右键按下
				vx = 1;
				break;
			case VK_SPACE:	//空格
				break;
			case 'A':	//字母键必须大写字符
				break;
			}
		}
		else if (msg.message == WM_KEYUP)
		{
			switch (msg.vkcode)
			{
			case VK_UP:		//上键按下
				vy = 0;
				break;
			case VK_DOWN:	//下键按下
				vy = 0;
				break;
			case VK_LEFT:	//左键按下
				vx = 0;
				break;
			case VK_RIGHT:	//右键按下
				vx = 0;
				break;
			}
		}
		//双缓冲绘图:所有的绘图代码必须放在begin和end之间
		BeginBatchDraw();
		cleardevice();//清屏

		//绘制小球
		setfillcolor(RGB(255, 278, 255));
		solidcircle(x, y, r);
		//更新小球的位置
		x += speed * vx;
		y += speed * vy;

		EndBatchDraw();

		Sleep(10);//防止小球移动太快

		//把消息类型设置为0
		msg.message = 0;
	}

	//防止程序退出
	Sleep(100000);
	return 0;
}

上面代码可以根据键盘上下左右移动一个小球

根据键盘上下左右移动小球,也可以修改小球的移动速度

相关推荐
近津薪荼25 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
敏叔V5871 小时前
AI智能体的工具学习进阶:零样本API理解与调用
人工智能·学习
2501_941864961 小时前
科学方法论破解学习时间堆砌误区
学习
1024小神2 小时前
SVG标签中path路径参数学习
学习
浅念-3 小时前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
ZH15455891313 小时前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter
简佐义的博客3 小时前
生信入门进阶指南:学习顶级实验室多组学整合方案,构建肾脏细胞空间分子图谱
人工智能·学习
近津薪荼3 小时前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
rannn_1113 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
张人玉4 小时前
VisionPro 定位与卡尺测量学习笔记
笔记·学习·计算机视觉·vsionprp