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;
}

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

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

相关推荐
hello1114-38 分钟前
Redis学习打卡-Day2-缓存更新策略、主动更新策略、缓存穿透、缓存雪崩、缓存击穿
java·redis·学习·缓存·javaweb
小虎卫远程打卡app2 小时前
视频编解码学习十二之Android疑点
学习·视频编解码
岁岁岁平安2 小时前
Vue3学习(组合式API——reactive()和ref()函数详解)
前端·javascript·vue.js·学习·vue3·reactive·ref
Camellia03113 小时前
嵌入式学习--江协51单片机day6
嵌入式硬件·学习·51单片机
m0_738206544 小时前
嵌入式学习的第二十一天-数据结构-双向链表
学习
Camellia03114 小时前
嵌入式学习--江科大51单片机day7
单片机·嵌入式硬件·学习·51单片机
ACGkaka_4 小时前
MySQL 学习(十)执行一条查询语句的内部执行过程、MySQL分层
学习·mysql·adb
shlR6 小时前
Figma 新手教程学习笔记
笔记·学习·figma
.小墨迹6 小时前
Apollo学习——键盘控制速度
linux·开发语言·c++·python·学习·计算机外设
honey ball6 小时前
正点原子T80烙铁拆解学习
学习