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

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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/432852.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云几核服务器够用?内存多少合适?

阿里云服务器配置怎么选择&#xff1f;CPU内存、公网带宽和系统盘怎么选择&#xff1f;个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例&#xff0c;企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器&#xff0c;阿里云服务器网aliyunfuwuqi.com整…

Git分布式管理-头歌实验远程版本库

Git的一大特点就是&#xff0c;能为不同系统下的开发者提供了一个协作开发的平台。而团队如果要基于Git进行协同开发&#xff0c;就必须依赖远程版本库。远程版本库允许&#xff0c;我们将本地版本库保存在远端服务器&#xff0c;而且&#xff0c;不同的开发者也是基于远程版本…

算法Day04_203.移除链表元素

推荐阅读 算法day01_ 27. 移除元素、977.有序数组的平方 算法day02_209.长度最小的子数组 算法day03_ 59.螺旋矩阵II 目录 推荐阅读203.移除链表元素题目思路解法暴力解法虚拟头结点解法 203.移除链表元素 题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删…

Python爬虫实战第三例【三】【上】

零.实现目标 爬取视频网站视频 视频网站你们随意&#xff0c;在这里我选择飞某速&#xff08;狗头保命&#xff09;。 例如&#xff0c;作者上半年看过的“铃芽之旅”&#xff0c;突然想看了&#xff0c;但是在正版网站看要VIP&#xff0c;在盗版网站看又太卡了&#xff0c;…

大模型快速实现python3+html内容在线渲染

需求&#xff1a; 有一份数据需要通过前端在线展示给用户&#xff0c;不需要复杂的样式交互&#xff0c;后端服务是基于Python3实现的API接口&#xff0c;对前端技术不是很了解&#xff0c;需要快速实现该需求。类似样式即可&#xff1a; 思路&#xff1a; 如果页面不复杂&am…

【MySQL】深入解析日志系统:undo log、redo log、bin log

文章目录 前言1、undo log1.1、undo log 是什么1.2、事务回滚 2、redo log2.1、redo log 是什么2.2、redo log 刷盘2.3、redo log 硬盘文件 3、bin log3.1、bin log 是什么3.2、bin log 和 redo log 区别3.3、bin log 刷盘3.4、两阶段提交 前言 MySQL数据库提供了功能强大的日…

一文了解74HCT14D的引脚图、符号、封装、数据手册及应用

74HCT14D 是一款采用硅栅 C2MOS 技术制造的高速 CMOS 施密特逆变器。它实现了类似于等效 LSTTL 的高速操作&#xff0c;同时保持 CMOS 的低功耗。该器件可用作电平转换器&#xff0c;用于将 TTL 或 NMOS 连接到高速 CMOS。 输入与 TTL、NMOS 和 CMOS 输出电压电平兼容。所有输入…

CSS实现选中卡片样式操作

图一默认自动选中&#xff0c;并且不可取消选中&#xff0c;当选择其他卡片才可点击下一步 在 “ src/assets ” 路径下存放 save.png&#xff0c;代表选中的状态 <div class"cards"><ul class"container"><li v-for"image in image…

今天BOSS约了个面试,HR直接发我一道面试题

前言 在电商、外卖、预约服务等场景中&#xff0c;订单超时自动取消是一个常见的业务需求。这一功能不仅提高了系统的自动化程度&#xff0c;还为用户提供了更好的体验。需求如下&#xff1a; TODO如果用户在生成订单后一定时间未支付&#xff0c;则系统自动取消订单。接下来…

大路灯哪个品牌好用?5款超火大路灯推荐,帮你全面了解大路灯!

大路灯是一种用于提供良好照明环境的电器&#xff0c;通过专业的技术&#xff0c;将光线用过折射、反射、过滤&#xff0c;最终呈现柔和明亮的光线。但市面上的大路灯琳琅满目&#xff0c;有些大路灯存在虚标数据和配置的问题&#xff0c;夸大宣传过后导致很多人入手&#xff0…

Android中的传感器类型和接口名称

本文将介绍传感器坐标轴、基础传感器和复合传感器&#xff08;动作传感器、姿势传感器、未校准传感器和互动传感器&#xff09;。 1. 传感器坐标轴 许多传感器的传感器事件值在相对于设备静止的特定坐标系中表示。 1.1 移动设备坐标轴 Sensor API 仅与屏幕的自然方向相关&a…

leetcode:88. 合并两个有序数组

原题地址&#xff1a;https://leetcode.cn/problems/merge-sorted-array/description/ 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&a…

VSCode安装

前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器&#xff0c;支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对…

网络原理初识(1)

目录 一、网络发展史 1、独立模式 2、网络互联 3、局域网LAN 局域网组建的方式 1、基于网线直连 2、基于集线器组建 3、基于交换机组建 4、基于交换机和路由器组建 4、广域网WAN 二、网络通信基础 1、IP地址 2、端口号 3、认识协议 4、五元组 一、网络发展史 1、独立模式 …

rabbitmq3

指定通过通道将消息发送给哪个消息队列 同一个通道可以向不同的队列发送消息的&#xff0c;如果你绑定的队列和发布消息的队列不一致也是可以的&#xff0c;这个才是真正的发布消息去具体的某一个队列&#xff1a; 如果队列没有持久化&#xff0c;就不会把这个消息队列保存在磁…

对象得定义与使用(动力节点老杜)

对象思想 1.什么是面向过程&#xff0c;什么是面向对象&#xff1f; 换而言之&#xff0c;面向对象思想实际就是将整体分成一个个独立的单元&#xff0c;每个单元都有自己得任务和属性&#xff0c;所有单元结合在一起完成一个整体。如果某个单元出现了问题还可以及时处理&…

微软研究深度报告:Sora文转视频AI模型全景剖析及未来展望

论文由微软研究团队撰写&#xff0c;这篇论文深入探讨了Sora的发展背景、核心技术、新兴应用场景、现有的局限性以及未来的发展机会&#xff0c;基于公开资料和团队自行进行的逆向工程分析。文中详尽且逻辑清晰&#xff0c;建议细读全文以获得深入了解。 原文&#xff1a;Sora…

nginx生成自签名SSL证书

备注&#xff1a;nginx自生成的ssl证书在浏览器访问时会提示此证书不受信用 1.安装nginx nginx必须有"--with-http_ssl_module"模块 查看nginx安装的模块&#xff1a; [rootmaster1 key]# nginx -V nginx version: nginx/1.24.0 built by gcc 4.8.5 20150623 (Red …

Python图像处理之光斑分析

文章目录 质心目标截取光斑半径 python图像处理教程&#xff1a;初步&#x1f4f7;插值变换&#x1f4f7;形态学处理&#x1f4f7;滤波 光斑是工程中经常出现的图像数据&#xff0c;其特点是目标明确&#xff0c;分布清晰。对光斑图像的分析&#xff0c;主要包括质心定位、目标…

【Android】反编译与预防被反编译

近期在开发一款软件时&#xff0c;遇上了加密、解密数据方面的一些技术问题无法攻克&#xff0c;于是抱着试试看的态度使用 jadx-gui 工具进行反编译一下。哎&#xff0c;居然还成功了&#xff0c;更骚的是&#xff0c;这一款App没有对应用进行混淆、加密、加固&#xff0c;没多…