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

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

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

相关推荐
zmd-zk1 小时前
flink学习(2)——wordcount案例
大数据·开发语言·学习·flink
Chef_Chen1 小时前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
hopetomorrow2 小时前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow2 小时前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
/**书香门第*/2 小时前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
美式小田3 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
猫爪笔记3 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
-一杯为品-3 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
风尚云网4 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
EterNity_TiMe_6 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip