【C++】开源:Windows图形库EasyX配置与使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍Windows图形库EasyX配置与使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明
      • 窗口绘制圆的示例:
      • 获取鼠标和键盘事件示例:
      • 鼠标操作与绘制示例:
      • 贪吃蛇示例:

😏1. 项目介绍

官网:https://easyx.cn/

EasyX是一个基于Windows的简单图形库,它提供了一个易于使用的图形绘制接口,适用于初学者和爱好者进行图形编程。下面是EasyX库的一些特点和功能:

1.易于学习和使用:EasyX采用了简单的图形绘制接口,使得初学者可以快速上手。它提供了一些基本的绘图函数,如画线、画圆、绘制文本等,使用户能够轻松创建图形界面和动画效果。

2.轻量级和快速:EasyX是一个轻量级的图形库,不需要复杂的安装和配置过程。它使用GDI(图形设备接口)来进行图形绘制,具有较快的绘图速度和相对较低的系统资源占用。

3.图形界面设计:EasyX提供了一些常用的图形界面控件,如按钮、文本框、滚动条等,使用户可以轻松创建交互式的图形界面。

4.动画和游戏开发:EasyX支持实时动画和游戏开发,提供了帧动画、双缓冲技术等功能,使用户能够创建流畅的动画效果和简单的游戏。

5.跨平台:EasyX主要针对Windows平台,支持Windows XP及以上版本。然而,EasyX也可以在部分Linux环境下使用,如Wine模拟器。

😊2. 环境配置

我这里用的Clion + mingw,EasyX的下载地址:https://easyx.cn/download/easyx4mingw_20220901.zip

CMakeLists.txt示例:

cmake_minimum_required(VERSION 3.19)
project(easyx_demo)set(CMAKE_CXX_STANDARD 14)include_directories("D:/develop/easyx4mingw_20220901/include")
link_directories("D:/develop/easyx4mingw_20220901/lib64")add_executable(easyx_demo main.cpp)
target_link_libraries(easyx_demo -leasyx)

😆3. 使用说明

官网也提供了函数使用的文档,并给出了一些示例:https://docs.easyx.cn/zh-cn/char-matrix

窗口绘制圆的示例:

#include <graphics.h>
#include <conio.h>int main()
{initgraph(640, 480);  // 创建一个640x480的绘图窗口circle(320, 240, 100);  // 在窗口中心画一个半径为100的圆getch();  // 等待用户按下任意键closegraph();  // 关闭绘图窗口return 0;
}

获取鼠标和键盘事件示例:

#include <graphics.h>
#include <conio.h>
#include <stdio.h>int main()
{initgraph(640, 480);  // 创建一个640x480的绘图窗口while (true){// 监听键盘事件if (kbhit()){char ch = getch();  // 获取键盘按键if (ch == 'q' || ch == 'Q')break;  // 如果按下了Q键,退出循环}// 监听鼠标事件if (MouseHit()){MOUSEMSG mouseMsg = GetMouseMsg();if (mouseMsg.uMsg == WM_MOUSEMOVE){int x = mouseMsg.x;int y = mouseMsg.y;// 在控制台输出鼠标移动的坐标printf("Mouse move: x = %d, y = %d\n", x, y);}else if (mouseMsg.uMsg == WM_LBUTTONDOWN){int x = mouseMsg.x;int y = mouseMsg.y;// 在控制台输出鼠标左键按下的坐标printf("Left button down: x = %d, y = %d\n", x, y);}else if (mouseMsg.uMsg == WM_LBUTTONUP){int x = mouseMsg.x;int y = mouseMsg.y;// 在控制台输出鼠标左键释放的坐标printf("Left button up: x = %d, y = %d\n", x, y);}}}closegraph();  // 关闭绘图窗口return 0;
}

鼠标操作与绘制示例:

#include <graphics.h>int main()
{// 初始化图形窗口initgraph(640, 480);ExMessage m;		// 定义消息变量while(true){// 获取一条鼠标或按键消息m = getmessage(EX_MOUSE | EX_KEY);switch(m.message){case WM_MOUSEMOVE:// 鼠标移动的时候画红色的小点putpixel(m.x, m.y, RED);break;case WM_LBUTTONDOWN:// 如果点左键的同时按下了 Ctrl 键if (m.ctrl)// 画一个大方块rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);else// 画一个小方块rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);break;case WM_KEYDOWN:if (m.vkcode == VK_ESCAPE)return 0;	// 按 ESC 键退出程序}}// 关闭图形窗口closegraph();return 0;
}

贪吃蛇示例:

#include <graphics.h>
#include <conio.h>
#include <time.h>const int CELL_SIZE = 20;  // 每个单元格的尺寸
const int WIDTH = 800;  // 窗口宽度
const int HEIGHT = 600;  // 窗口高度
const int ROWS = HEIGHT / CELL_SIZE;  // 行数
const int COLS = WIDTH / CELL_SIZE;  // 列数struct Point  // 坐标点结构体
{int x, y;
};enum Direction  // 移动方向枚举
{UP,DOWN,LEFT,RIGHT
};void DrawCell(int x, int y, COLORREF color)
{setfillcolor(color);setlinecolor(color);fillrectangle(x * CELL_SIZE, y * CELL_SIZE, (x + 1) * CELL_SIZE, (y + 1) * CELL_SIZE);
}void DrawSnake(Point* snake, int length)
{for (int i = 0; i < length; i++){if (i == 0)DrawCell(snake[i].x, snake[i].y, RGB(0, 255, 0));  // 绘制蛇头elseDrawCell(snake[i].x, snake[i].y, RGB(0, 200, 0));  // 绘制蛇身}
}void GenerateFood(Point* snake, int length, Point& food)
{while (true){food.x = rand() % COLS;food.y = rand() % ROWS;bool overlap = false;for (int i = 0; i < length; i++){if (snake[i].x == food.x && snake[i].y == food.y){overlap = true;break;}}if (!overlap)break;}DrawCell(food.x, food.y, RGB(255, 0, 0));  // 绘制食物
}void UpdateSnake(Point* snake, int& length, Direction direction, bool& gameOver)
{Point head = snake[0];Point newHead = head;switch (direction){case UP:newHead.y--;break;case DOWN:newHead.y++;break;case LEFT:newHead.x--;break;case RIGHT:newHead.x++;break;}if (newHead.x < 0 || newHead.x >= COLS || newHead.y < 0 || newHead.y >= ROWS){gameOver = true;  // 越界,游戏结束return;}for (int i = length - 1; i > 0; i--){snake[i] = snake[i - 1];}snake[0] = newHead;for (int i = 1; i < length; i++){if (snake[i].x == newHead.x && snake[i].y == newHead.y){gameOver = true;  // 撞到自己,游戏结束return;}}
}int main()
{initgraph(WIDTH, HEIGHT);  // 创建一个指定宽高的绘图窗口srand(static_cast<unsigned int>(time(nullptr)));  // 初始化随机数种子Point* snake = new Point[ROWS * COLS];  // 蛇的坐标数组int length = 1;  // 蛇的初始长度Direction direction = RIGHT;  // 蛇的初始移动方向bool gameOver = false;  // 游戏是否结束// 初始化蛇的初始位置snake[0].x = COLS / 2;snake[0].y = ROWS / 2;Point food;  // 食物的坐标GenerateFood(snake, length, food);  // 生成食物while (!gameOver){// 监听键盘事件if (kbhit()){char ch = getch();switch (ch){case 'W':case 'w':if(direction != DOWN)direction = UP;break;case 'S':case 's':if (direction != UP)direction = DOWN;break;case 'A':case 'a':if (direction != RIGHT)direction = LEFT;break;case 'D':case 'd':if (direction != LEFT)direction = RIGHT;break;}}cleardevice();  // 清空绘图窗口UpdateSnake(snake, length, direction, gameOver);  // 更新蛇的位置if (snake[0].x == food.x && snake[0].y == food.y){length++;  // 蛇吃到食物,长度增加GenerateFood(snake, length, food);  // 生成新的食物}DrawSnake(snake, length);  // 绘制蛇DrawCell(food.x, food.y, RGB(255, 0, 0));  // 绘制食物Sleep(100);}delete[] snake;  // 释放内存closegraph();  // 关闭绘图窗口return 0;
}

在这里插入图片描述

以上。

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

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

相关文章

Linux进程信号(2)--信号的保存

目录 1.阻塞信号 1.1 信号其他相关常见概念 1.实际执行信号的处理动作称为信号递达(Delivery&#xff09; 2.信号从产生到递达之间的状态,称为信号未决(Pending)。 3.进程可以选择阻塞 (Block )某个信号。 1.2信号在内核中的表示 sigset_t 信号集操作函数 使用sigprocm…

nginx slice模块的使用和源码分析

文章目录 1. 为什么需要ngx_http_slice_module2. 配置指令3. 加载模块4. 源码分析4.1 指令分析4.2 模块初始化4.3 slice模块的上下文4.2 $slice_range字段值获取4.3 http header过滤处理4.4 http body过滤处理5 测试和验证 1. 为什么需要ngx_http_slice_module 顾名思义&#…

Vue中keep-alive的作用、原理及应用场景

在进行Vue开发的过程中&#xff0c;我们经常会遇到需要进行组件缓存的场景&#xff0c;这时候Vue提供的keep-alive组件就派上了用场。keep-alive组件是Vue内置的一个抽象组件&#xff0c;它可以将其包裹的组件进行缓存&#xff0c;提高组件的性能&#xff0c;同时也可以节省服务…

普渡机器人CEO预测2024年服务机器人市场将扩大

原创 | 文 BFT机器人 根据普渡科技有限公司的报告&#xff0c;商用服务机器人在东亚地区的应用比其他地方更为广泛。然而&#xff0c;预计到2024年&#xff0c;全球其他地区也将迎头赶上。这家总部位于中国深圳的公司自豪地宣称&#xff0c;它已经成为中国最大的此类机器人出口…

前端excel带样式导出 exceljs 插件的使用

本来用的xlsx和xlsx-style两个插件&#xff0c;过程一步一个坑&#xff0c;到完全能用要消灭好多bug。这时发现了exceljs&#xff0c;真香&#x1f600; 案例 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"view…

详解WebRTC rtc::Thread实现

rtc::Thread介绍 rtc::Thread类不仅仅实现了线程这个执行器&#xff08;比如posix底层调用pthread相关接口创建线程&#xff0c;管理线程等&#xff09;&#xff0c;还包括消息队列&#xff08;message_queue)的实现&#xff0c;rtc::Thread启动后就作为一个永不停止的event l…

如何使用MCSM搭建我的世界Java版服务器并实现远程联机游戏

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 本教程主要介…

c语言实现greedy snake(贪吃蛇)

##第一个小项目 大一学生寒假项目 最终实现效果如图 一.以C语言实现个人小项目 在我们快速学完了一个高级编程语言&#xff0c;就应该写一个小项目来加以巩固自己的学习成果。 所以今天&#xff0c;我们来尝试写一写greedy snake&#xff0c;对于大学生来说也是可以加强能…

2,cdc放缩位图

类似地&#xff0c;用pDC->StretchBlt来缩放&#xff0c;只是加上了两个参数&#xff0c;原始位图的宽高。 void CMy1_showbitmapView::StretchBitMap(CDC * pDC) { //CBitmap对象 CBitmap bitmap; //CDC对象 CDC dcMemory; //加载资源 bitmap.LoadBitmapW(IDB_BITMAP1); /…

JUnit

前言&#xff1a;自动化就是selenium脚本来实现的&#xff0c;JUnit是java的单元测试工具&#xff0c;只不过我们在实现自动化的时候需要借助一下JUnit库里面提供的一些方法。 目录 1、Test 2、断言—Assertions类 3、用例的执行顺序 3.1 通过order注解来排序 3.2 参数化 …

delete、truncate和drop区别

一、从执行速度上来说 drop > truncate >> DELETE 二、从原理上讲 1、DELETE DELETE from TABLE_NAME where xxx1.1、DELETE属于数据库DML操作语言&#xff0c;只删除数据不删除表的结构&#xff0c;会走事务&#xff0c;执行时会触发trigger&#xff08; 触发器…

ChatGPT之搭建API代理服务

简介 一行Docker命令部署的 OpenAI/GPT API代理&#xff0c;支持SSE流式返回、腾讯云函数 。 项目地址&#xff1a;https://github.com/easychen/openai-api-proxy 这个项目可以自行搭建 OpenAI API 代理服务器工具&#xff0c;该项目是代理的服务器端&#xff0c;不是客户端。…

IP数据云识别真实IP与虚假流量案例

随着互联网的普及&#xff0c;企业在数字领域面临着越来越复杂的网络威胁。为了保护网站免受虚假流量和恶意攻击的影响&#xff0c;许多企业正在采用IP数据云。本文将结合一个真实案例&#xff0c;深入探讨IP数据云如何成功准确地识别真实用户IP和虚假流量IP&#xff0c;提高网…

【数据分享】1929-2023年全球站点的逐日降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐日平均气温数据、逐日最高气温数据…

计算机网络_1.6.1 常见的三种计算机网络体系结构

1.6.1 常见的三种计算机网络体系结构 1、OSI&#xff08;七层协议&#xff09;标准失败的原因2、TCP/IP参考模型3、三种网络体系结构对比 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 1、OSI&#xff08;七层协议&#xff09;标准失败的原因 &#xff08;1&#xf…

[SWPUCTF 2021 新生赛]easyupload1.0

发现是上传文件第一想到是文件木马 <?php eval ($_POST[123]);?>木马上传burp修改后缀发现flag里面这个是假的 我们猜想是在phpinfo我们上传<?php eval(phpinfo(););?>木马上传burp修改后缀里面 CtrlF 发现flag

IT行业证书的获取与价值:提升职业竞争力的关键

目录 IT行业证书的价值和作用 1. Cisco&#xff08;思科&#xff09;认证&#xff08;如CCNA、CCNP、CCIE&#xff09;&#xff1a; 2. 微软认证&#xff08;如MCSA、MCSE、MCSD&#xff09;&#xff1a; 3. 计算机网络技术&#xff08;CompTIA Network、CompTIA Security&a…

亲测解决vscode的debug用不了、点了没反应

这个问题在小虎登录vscode同步了设置后出现,原因是launch文件被修改或删除。解决方法是重新添加launch。 坏境配置 win11 + vscode 解决方法 Ctrl + shift + P,搜索debug添加配置: 选择python debugger。 结果生成了一个文件在当前路径: launch内容: {// Use Int…

【jenkins】主从机制及添加Slave节点操作

一、master-slave 日常构建Jenkins任务中&#xff0c;会经常出现下面的情况&#xff1a; 自动化测试需要消耗大量的 CPU 和内存资源&#xff0c;如果服务器上还有其他的服务&#xff0c;可能会造成卡顿或者宕机这样的情况&#xff1b; Jenkins 平台上除了这个项目&#xff0c…

雷达DoA估计的跨行业应用--麦克风阵列声源定位(Matlab仿真)

一、概述 麦克风阵列&#xff1a; 麦克风阵列是由一定数目的声学传感器&#xff08;麦克风&#xff09;按照一定规则排列的多麦克风系统&#xff0c;而基于麦克风阵列的声源定位是指用麦克风拾取声音信号&#xff0c;通过对麦克风阵列的各路输出信号进行分析和处理&#xff0c;…