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

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

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

相关推荐
西瓜本瓜@2 小时前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio
BOB-wangbaohai4 小时前
Flowable7.x学习笔记(十三)查看部署流程图
笔记·学习·流程图
电子云与长程纠缠7 小时前
Unreal Niagara制作SubUV贴图翻页动画
学习·ue5·编辑器·贴图·niagara
xing_x_xx8 小时前
Linux系统学习----概述与目录结构
学习
DKPT8 小时前
常见正则表达式整理与Java使用正则表达式的例子
java·笔记·学习·面试·正则表达式
爱码小白9 小时前
wordpress学习笔记
笔记·学习
我的golang之路果然有问题9 小时前
快速上手GO的net/http包,个人学习笔记
笔记·后端·学习·http·golang·go·net
大溪地C9 小时前
HTML5 详细学习笔记
笔记·学习·html5
四夕白告木贞10 小时前
stm32week12
stm32·单片机·嵌入式硬件·学习
chuxinweihui10 小时前
数据结构——栈与队列
c语言·开发语言·数据结构·学习·算法·链表