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));elsesetfillcolor(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);//设置窗口的颜色使用:setbkcolorsetbkcolor(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();//把消息类型设置为0msg.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);//屏幕方向为正120break;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);//设置窗口的颜色使用:setbkcolorsetbkcolor(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);//防止小球移动太快//把消息类型设置为0msg.message = 0;}//防止程序退出Sleep(100000);return 0;
}

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

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Batch Normalization和Layer Normalization和Group normalization

文章目录 前言一、Group normalization二、批量规范化(Batch Normalization)三、层规范化&#xff08;Layer Normalization&#xff09; 前言 批量规范化和层规范化在神经网络中的每个批次或每个层上进行规范化&#xff0c;而GroupNorm将特征分成多个组&#xff0c;并在每个组内…

表格制作一对多,多对多

<!-- <tr><td>第1行第1列</td><td>第1行第2列</td></tr><tr><td rowspan"4">第2行第1列</td><td colspan"2">第2行第2列</td><td colspan"3">第2行第2列</td>…

STM32CubeMX学习笔记8 -ADC

1. ADC简介 ADC 是Analog-to-Digital Converter的缩写。指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。简单地说就是将模拟电压值&#xff0c;转换成对应的肉眼…

力扣--动态规划152.乘积最大子数组

思路分析&#xff1a; 使用动态规划&#xff0c;定义一个二维数组dp&#xff0c;其中dp[i][0]表示以第i个元素结尾的乘积最大子数组的乘积&#xff0c;dp[i][1]表示以第i个元素结尾的乘积最小子数组的乘积。初始化dp数组的第一个元素为数组的第一个元素。遍历数组&#xff0c;…

c语言经典测试题11

1.题1 #include <stdio.h> int main() { int a[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p a 5, *q NULL; *q *(p5); printf("%d %d\n", *p, *q); return 0; }上述代码的运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;我们创建了一个数…

《汇编语言》 第3版 (王爽)实验6解析

第7章 实验6解析 &#xff08;1&#xff09;.编程&#xff0c;完成问题7.9中的程序。 问题7.9 编程&#xff0c;将datasg段中每个单词的前4个字母改为大写字母。 assume cs:codesg,ss:stacksg,ds:datasgstacksg segment ;开辟了栈段空间&#xff0c;容量为16个字节dw 0,0,0,0…

Ai-WB2-32S在window下使用vs 和 msys2编译以及烧录

文章目录 前言一、使用前准备第一步 安装vscode第二步 安装msys2 二、使用步骤1.打开MSYS2 MINGW64&#xff08;1&#xff09;在开始栏中找到MSYS2 MINGW64并打开&#xff08;2&#xff09;安装git&#xff08;3&#xff09;安装make&#xff08;4&#xff09;安装好之后的文件…

C# 中 Interpreter 用于解释执行代码的工具

在 C# 中&#xff0c;Interpreter 是一个用于解释执行代码的工具&#xff0c;它提供了一种在运行时动态解释和执行 C# 代码的方式。Interpreter 类位于 Microsoft.CodeAnalysis.CSharp.Scripting 命名空间中&#xff0c;它允许你通过编写代码字符串来执行 C# 代码。 下面是一些…

每日一题——LeetCode1576.替换所有的问号

方法一 3个字母原则 把&#xff1f;替换为和他左右都不相等的字符&#xff0c;那么找3个字符abc&#xff0c;&#xff1f;总能替换为abc中的一个字符&#xff0c;遍历字符串找到所有&#xff1f;&#xff0c;再遍历abc把&#xff1f;替换为abc中的一个字符 var modifyString …

Redis缓存【重点】

参考链接 https://xiaolincoding.com/redis/cluster/cache_problem.html#%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9 目录 缓存雪崩大量数据同时过期Redis 故障宕机 缓存击穿第一种方案&#xff0c;非法请求的限制第二种方案&#xff0c;缓存空值或者默认值第三种方案&#xff0c;使…

【C++】继续学习 string类 吧

开始使用 string类 吧 1 继续学习1.1 扩容机制1.2 string类对象的访问及遍历操作1.3 string类对象的修改操作1.4 其他一些成员函数 2 实践解决问题&#xff1a;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&…

透明玻璃屏幕为什么那么贵

透明玻璃屏幕之所以价格较高&#xff0c;主要是由于以下几个方面的原因&#xff1a; 技术研发与创新&#xff1a;透明玻璃屏幕作为一种先进的显示技术&#xff0c;其研发和制造过程涉及到许多复杂的技术。这些技术的研发和创新需要投入大量的资金和时间。此外&#xff0c;透明玻…