鼠标交互初体验:点击屏幕生成彩色气泡(EGE 库基础)

在图形编程领域,实现与用户的交互是让程序变得生动有趣的关键环节。对于初学者来说,使用合适的图形库能大幅降低开发难度,快速实现创意想法。EGE 库作为一款简单易用且功能强大的 C/C++ 图形库,特别适合新手入门图形交互编程。本文将通过 “点击屏幕生成彩色气泡” 这一趣味项目,带你快速掌握 EGE 库的基础使用方法,开启鼠标交互编程的奇妙之旅。

一、EGE 库简介与环境搭建

1.1 EGE 库概述

EGE(Easy Graphics Engine)是一个用于 C/C++ 语言的图形库,语法与 Turbo C 的图形库类似,同时借鉴了部分 OpenGL 的特性,方便 C/C++ 开发者快速上手图形编程。它支持在 Windows、Linux、macOS 等多个平台上运行,提供了丰富的绘图函数,如绘制直线、圆形、矩形,以及设置颜色、字体等功能,还能处理鼠标、键盘等用户输入事件,非常适合开发简单的图形界面程序、小游戏等。

1.2 环境搭建

  • Windows 平台
    1. 下载 EGE 库安装包,可从 EGE 官方网站(http://www.ege.edu.cn/)获取。
    2. 解压安装包,将include文件夹下的头文件复制到编译器的头文件目录(例如,对于 MinGW 编译器,通常是C:\MinGW\include);将lib文件夹下对应编译器的库文件(如libege.dll.a等)复制到编译器的库文件目录(如C:\MinGW\lib) 。
    3. 在编译时,需要链接 EGE 库,例如使用gcc编译代码时,添加参数-lege
  • Linux 平台
    1. 通过包管理器安装 EGE 库,如在 Debian/Ubuntu 系统中,可使用命令sudo apt-get install ege
    2. 安装完成后,即可在代码中包含 EGE 库的头文件进行编程,编译时同样需要链接库文件,例如gcc your_code.c -o your_program -lege
  • macOS 平台:相对复杂一些,需要先安装 Xcode Command Line Tools,然后通过编译源代码的方式安装 EGE 库,具体步骤可参考官方文档。

二、实现思路解析

本次项目要实现的 “点击屏幕生成彩色气泡” 功能,主要包含以下几个步骤:

  1. 初始化图形窗口:使用 EGE 库创建一个图形窗口,作为展示气泡的区域。
  2. 处理鼠标点击事件:监听鼠标在窗口内的点击操作,获取点击的坐标位置。
  3. 绘制彩色气泡:在鼠标点击的位置,使用随机颜色绘制圆形气泡。
  4. 持续显示与更新:保持图形窗口持续显示,并不断响应新的鼠标点击事件,生成新的气泡。

三、代码实现详解

3.1 引入头文件与初始化窗口

#include <graphics.h>  // EGE图形库头文件
#include <stdio.h>
#include <time.h>int main() {initgraph(800, 600);  // 创建一个800x600的图形窗口setcaption("点击屏幕生成彩色气泡");  // 设置窗口标题srand(time(NULL));  // 设置随机数种子return 0;
}

在上述代码中:

  • #include <graphics.h>引入 EGE 图形库的头文件,以便使用库中的各种函数。
  • initgraph(800, 600)函数用于创建一个宽度为 800 像素、高度为 600 像素的图形窗口。
  • setcaption("点击屏幕生成彩色气泡")设置图形窗口的标题。
  • srand(time(NULL))利用当前系统时间设置随机数种子,为后续生成随机颜色做准备。

3.2 处理鼠标点击事件与绘制气泡

#include <graphics.h>
#include <stdio.h>
#include <time.h>int main() {initgraph(800, 600);setcaption("点击屏幕生成彩色气泡");srand(time(NULL));MOUSEMSG m;  // 定义鼠标消息结构体while (1) {if (MouseHit()) {  // 检测是否有鼠标事件m = GetMouseMsg();  // 获取鼠标消息if (m.uMsg == WM_LBUTTONDOWN) {  // 判断是否为鼠标左键按下int r = rand() % 256;  // 随机生成红色分量int g = rand() % 256;  // 随机生成绿色分量int b = rand() % 256;  // 随机生成蓝色分量setfillcolor(RGB(r, g, b));  // 设置填充颜色fillcircle(m.x, m.y, 30);  // 在点击位置绘制半径为30的圆形气泡}}}closegraph();  // 关闭图形窗口return 0;
}

这段代码实现了核心功能:

  • MOUSEMSG m;定义了一个MOUSEMSG类型的变量m,用于存储鼠标消息。
  • while (1)创建一个无限循环,持续检测鼠标事件。
  • MouseHit()函数用于检测是否有鼠标事件发生,如果有则返回非零值。
  • m = GetMouseMsg();获取鼠标事件的详细信息,并存储在m中。
  • 通过if (m.uMsg == WM_LBUTTONDOWN)判断鼠标消息类型是否为左键按下事件。
  • 当检测到鼠标左键按下时,使用rand() % 256随机生成红色、绿色和蓝色分量的值,范围在 0 - 255 之间。
  • setfillcolor(RGB(r, g, b))设置圆形气泡的填充颜色,RGB函数根据红、绿、蓝分量生成对应的颜色值。
  • fillcircle(m.x, m.y, 30)在鼠标点击的坐标位置(m.x为横坐标,m.y为纵坐标)绘制一个半径为 30 的圆形气泡,并进行填充。

3.3 完整代码与注释

#include <graphics.h>  // 引入EGE图形库头文件
#include <stdio.h>
#include <time.h>int main() {initgraph(800, 600);  // 创建800x600的图形窗口setcaption("点击屏幕生成彩色气泡");  // 设置窗口标题srand(time(NULL));  // 以当前时间为随机数种子MOUSEMSG m;  // 用于存储鼠标消息的结构体while (1) {if (MouseHit()) {  // 检测是否有鼠标事件发生m = GetMouseMsg();  // 获取鼠标事件的详细信息if (m.uMsg == WM_LBUTTONDOWN) {  // 判断是否为鼠标左键按下// 随机生成红、绿、蓝颜色分量int r = rand() % 256; int g = rand() % 256; int b = rand() % 256; setfillcolor(RGB(r, g, b));  // 设置圆形气泡的填充颜色fillcircle(m.x, m.y, 30);  // 在点击位置绘制半径为30的气泡}}}closegraph();  // 关闭图形窗口return 0;
}

四、运行与拓展

4.1 运行程序

将上述代码保存为.c文件(例如bubble_click.c),使用对应编译器进行编译。如在 Windows 系统下使用 MinGW 编译器,在命令行中进入代码所在目录,执行命令gcc bubble_click.c -o bubble_click -lege,编译成功后会生成可执行文件bubble_click.exe,双击运行该文件,即可看到图形窗口。在窗口中点击鼠标左键,就能生成五彩斑斓的气泡。

4.2 功能拓展

  • 改变气泡大小:可以在绘制气泡时,随机生成气泡的半径,使气泡大小不一,增加视觉效果。例如将fillcircle(m.x, m.y, 30);改为fillcircle(m.x, m.y, rand() % 20 + 10);,让气泡半径在 10 - 29 之间随机变化。
  • 添加气泡移动效果:为每个气泡添加速度变量,在循环中不断更新气泡的位置,模拟气泡飘动的效果。这需要定义新的数据结构来存储每个气泡的状态信息,并在循环中处理其移动逻辑。
  • 实现气泡消失效果:可以设定气泡存在的时间,当超过一定时间后,将其从屏幕上移除,使画面更加动态和真实。

通过这个简单的项目,相信你已经对 EGE 库的基础使用和鼠标交互编程有了初步了解。后续可以尝试结合更多 EGE 库的功能,开发出更复杂、有趣的图形程序和小游戏。

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

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

相关文章

Office 三大组件Excel、Word、Access 里 VBA 区别对比

以下是Excel、Word和Access在VBA中的主要区别对比及详细说明: 核心对象模型 Excel Workbook(工作簿)→ Worksheet(工作表)→ Range(单元格区域) 核心围绕单元格数据处理,如 Cells(1,1).Value = "数据" Word Document(文档)→ Range(文本范围)→ Paragrap…

【上位机——MFC】对象和控件绑定

对象和控件绑定 将控件窗口和类对象绑定具有两大作用 如果和数据类对象绑定&#xff0c;对象和控件可以进行数据交换。 如果和控件类对象绑定&#xff0c;对象就可以代表整个控件。 与数据类型对象绑定的使用 数据类型对象和控件可实现数据交互重写父类成员虚函数DoDataExch…

Excel处理控件Aspose.Cells教程:压缩Excel文件完整指南

Excel 电子表格是管理、分析和可视化数据的有效工具&#xff0c;但随着文件复杂度的增加&#xff0c;它们很快就会变得臃肿。无论是由于数据集庞大、嵌入图片、格式过多还是隐藏工作表&#xff0c;Excel 文件的大小都可能迅速膨胀&#xff0c;导致打开速度变慢、难以通过电子邮…

软考【软考高级QA】

软考高级QA 1.操作系统管理和调度进程时&#xff0c;有哪些状态&#xff1f;&#xff08;5种&#xff09;2.操作系统管理和调度进程时&#xff0c;会进行哪些状态转换&#xff1f; 1.操作系统管理和调度进程时&#xff0c;有哪些状态&#xff1f;&#xff08;5种&#xff09; …

神经网络基础-从零开始搭建一个神经网络

一、什么是神经网络 人工神经网络&#xff08;Articial Neural Network&#xff0c;简写为ANN&#xff09;也称为神经网络&#xff08;NN),是一种模仿生物神经网络和功能的计算模型&#xff0c;人脑可以看做是一个生物神经网络&#xff0c;由众多的神经元连接而成&#xff0c;…

Golang 接口 vs Rust Trait:一场关于抽象的哲学对话

一、引言 在现代编程语言中&#xff0c;接口&#xff08;Interface&#xff09; 和 Trait 是实现多态和抽象行为的关键机制。它们允许我们定义行为契约&#xff0c;让不同的类型共享相同的语义接口&#xff0c;从而提升代码的复用性和扩展性。 Go 和 Rust 分别代表了两种截然…

java实现一个操作日志模块功能,怎么设计

为了设计一个高效、可靠且可扩展的操作日志模块&#xff0c;可以结合 ​AOP&#xff08;面向切面编程&#xff09;​、异步处理​&#xff08;多线程或MQ&#xff09;以及合理的存储策略&#xff0c;具体方案如下&#xff1a; ​1. 技术选型与架构设计​ ​​(1) AOP 实现非侵…

【论文阅读】HunyuanVideo: A Systematic Framework For Large Video Generative Models

HunyuanVideo: A Systematic Framework For Large Video Generative Models 原文摘要 研究背景与问题 视频生成的变革性影响&#xff1a;近期视频生成技术的进步深刻改变了个人生活与行业应用。 闭源模型的垄断&#xff1a;主流视频生成模型&#xff08;如Runway Gen-3、Luma …

在ubuntu中brpc框架安装

下载最新release版本&#xff0c; 稳定性好&#xff0c; 网址链接。 一、解压源码包 # 解压到当前目录 tar -xzvf brpc-1.12.1.tar.gz# 进入解压后的目录 cd brpc-1.12.1二、安装编译依赖&#xff08;Ubuntu/Debian&#xff09; sudo apt update sudo apt install -y g make…

《深入理解 Java 虚拟机》笔记

文章目录 最近笔记内存管理执行子系统程序编译、代码优化 老版本 最近笔记 内存管理 执行子系统 程序编译、代码优化 老版本

【Linuc】深入理解 Linux 文件权限

文章目录 一、权限基础解析1. 权限三元组2. 权限类型与数字映射二、查看文件权限三、修改权限实战1. chmod 命令符号模式数字模式(推荐)2. chown 修改归属四、特殊权限机制1. SetUID (Set User ID)2. SetGID (Set Group ID)3. Sticky Bit五、高级权限管理1. 默认权限控制2. A…

RabbitMq学习(第一天)

文章目录 1、mq(消息队列)概述2、RabbitMQ环境搭建3、java基于AMQP协议操作RabbitMQ4、基于Spring AMQP操作RabbitMQ5、代码中创建队列与交换机①、配置类创建②、基于RabbitListener注解创建 6、RabbitMQ详解①、work模型②、交换机1、Fanout(广播)交换机2、Direct(定向)交换机…

缓存置换:用c++实现最不经常使用(LFU)算法

在探讨缓存置换算法时&#xff0c;我们曾详细解读过LRU&#xff08;Least Recently Used&#xff09;算法&#xff0c;它凭借 “最近最少使用” 的策略在缓存管理领域大放异彩。今天&#xff0c;让我们将目光聚焦于另一种重要的缓存置换算法 ——LFU&#xff08;Least Frequent…

深度学习模型的部署实践与Web框架选择

引言 在深度学习项目的完整生命周期中&#xff0c;模型训练只是第一步&#xff0c;将训练好的模型部署到生产环境才能真正发挥其价值。本文将详细介绍模型部署的核心概念、常见部署方式以及三种主流Python Web框架的对比分析&#xff0c;帮助开发者选择最适合自己项目的技术方…

多功能气体检测报警系统,精准监测,守护安全

在化学品生产、石油化工、矿山、消防、环保、实验室等领域&#xff0c;有毒有害气体泄漏风险严重威胁工作人员和环境安全。化工企业生产中易产生大量可燃有毒气体&#xff0c;泄漏达一定浓度易引发爆炸、中毒等重大事故&#xff1b;矿井下瓦斯、一氧化碳等有害气体的浓度实时监…

lvgl多语言设置

搭建开发环境 安装node.js 安装node.js&#xff0c;点击进入官网地址 安装lv_i18n lv_i18n项目地址&#xff1a;Github&#xff1a;https://github.com/lvgl/lv_i18ngit运行命令安装lv_i18n&#xff1a;npm i lv_i18n -g。测试命令&#xff1a;lv_i18n -h 搭建过程报错 …

线程池技术

线程池基本概念 线程池就是在任务还没有到来前&#xff0c;预先创建一定数量的线程放入空闲列表。这些线程都是处于阻塞状态&#xff0c;不消耗CPU&#xff0c;但占用较小的内存空间。 当新任务到来时&#xff0c;缓冲池选择一个空线程&#xff0c;把任务传入此线程中运行&…

Go语言中的并发编程--详细讲解

文章目录 Go语言并发编程**简单介绍**goroutine channel 实现并发和并行for循环开启多个协程Channel管道goroutine 结合 channel 管道**goroutine 结合 channel打印素数**单向管道Select多路复用Goroutine Recover解决协程中出现的PanicGo中的并发安全和互斥锁 Go语言并发编程 …

C# NX二次开发:投影曲线和偏置曲线UFUN函数详解

大家好&#xff0c;今天要讲的是关于投影曲线和偏置曲线相关的函数。 &#xff08;1&#xff09;UF_CURVE_create_proj_curves1&#xff1a;这个函数的定义为创建投影曲线。 Defined in: uf_curve.h Overview Creates projection curves. Objects to project may be poi…

用R语言+随机森林玩转遥感空间预测-基于R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析

遥感数据具有高维度、非线性及空间异质性等特点&#xff0c;传统分析方法往往难以充分挖掘其信息价值。机器学习技术的引入为遥感数据处理与模型预测提供了新的解决方案&#xff0c;其中随机森林&#xff08;Random Forest&#xff09;以其优异的性能和灵活性成为研究者的首选工…