Easyx入门

最近需要动手制作小项目(本人还是c语言小菜狗),所以加急学习了Easyx,这是我的一些笔记与心得。

这是本人第一次写长文,还请大家多多支持呀!!!

  • 封面第三图是网图(侵删)

学习视频:

  【C/C++/EasyX】学编程,做游戏,小白快速入门图形编程,零基础入门到精通,学习就是这么快乐_哔哩哔哩_bilibili

老师很有趣,不仅学到了图形库,学到了地道的Chinglish 。(强推!!)


Easyx入门

目录

Easyx入门

1.基本说明

2 .Easyx原理

3.安装

4.Easyx颜色 

5.Easyx坐标和设备

6.窗口函数

7.图形绘制函数 

 8.文字绘制函数

9.图像处理函数 

 10.鼠标消息函数 

11.键盘消息函数 (非Easyx函数)

12.音乐播放函数 

13.其他函数 

14.总结


1.基本说明

  • Easyx是针对 C++ 的图形库,可以帮助C/C++初学者快速上手图形和游戏编程。(注意创建文件时用C++文件,only for c++)
  • Easyx适合新手,比其他难度要低一点。
  • 比黑框框好看啊!!!

2 .Easyx原理

     基于Windows的图形编辑,对其进行封装成的函数库。

3.安装

官网下载:EasyX Graphics Library for C++

安装合适版本的vc++和Easyx文档

4.Easyx颜色 

用RGB宏合成颜色,实际上合成出来的颜色是一个十六进制的的整数。

RGB(红色,绿色,蓝色);

每个颜色的值都是从0~255

  • 可以使用电脑的mspaint找颜色的RGB值
  • 有几种简单的颜色英文快捷方式,如WHITE,YELLOW,GREEN等等(注意用大写)

5.Easyx坐标和设备

  • 坐标默认错原点在窗口的左上角,X轴向右为正,Y 轴向下为正,度量单位是像素点。
  • 设备:简单来说,就是绘图表面。
  • 在EasyX中,设备分两种,一种是默认的绘图窗口另一种是IMAGE对象。通过SetWorkinglmage()函数可以设置当前用于绘图的设备。设置当前用于绘图的设备后,所有的绘图函数都会绘制在该设备上。

6.窗口函数

initgraph(int width,int heigh,int flag=NULL);用于初始化绘图窗口(创建窗口)

 width 指定窗口的宽度

 height 指定窗口的高度

 flag 窗口的样式,默认为NULL

flag的几种形式:

 若要同时实现:initgraph(x,y,NOCLOSE | NOMINIMIZE);使用 | 隔开

  • 注意需要使用getchar();接收窗口。话说吃饭要用筷子呢,接收窗口也要getchar();

closegraph();关闭绘图窗口(无参数函数) 

 cleardevice();清空绘图设备,实际是覆盖之前的图形,删除等于覆盖。(无参数函数)

例如:setbkcolor(WHITE);

           cleardevice();

这样就可以实现清空(覆盖)之前的背景,然后加上背景了。

  • 注意要先设置背景颜色再清除背景,因为本质是覆盖,用白色背景覆盖原有背景。

7.图形绘制函数 

  • 绘图函数从填充样式分类可以分为无填充,有边框填充,无边框三种。

以画圆为例: 

 circle()无填充

fillcircle()有边框填充

solidcircle()无边框填充

不知道有什么区别?直接上图:从左往右分别是无填充,有边框填充,无边框填充 

 

  • 设置填充颜色 setfillcolor(颜色); 
  • 设置线条样式 setlinestyle(样式,厚度);
  • 设置线条颜色 setlinecolor(颜色);

           线条样式有:PS_SOLID 实线 PS_DASH 虚线 PS_DOT 点线,还有其他就不一一赘述了。

         (tips:右键函数或者右键变量转到定义可以查看更多信息,如上图。)

 

 8.文字绘制函数

  •  outtextxy(int x,int y,字符串);在指定位置输出字符串
  • settextcolor(颜色);设置当前文字颜色
  • settextstyle(高度,宽度,字体);设置字体样式
  • setbkmode(TRANSPARENT);去掉字体的背景
  • textheight(字符串);获取字符串实际占用的像素高度
  • textwidth(字符串);获取字符串实际占用的像素宽度

     如果高度,宽度为0,则比例自适应。字体可直接写“楷体”

  • 这时候输入字符串编译时会报错,该怎么解决呢?
  1. 字符串前面加上L
  2. 项目 ->属性 ->高级->字符集->使用多字节字符集 
  •  如何将文字居中:(实际是数学问题)
  1. 计算出字符串所占用的像素高度与宽度,textheight () ; textwidth () ;
  2.  计算居中时的空隙高度和空隙宽度
  3. 用空隙加上要居中图形的宽度

在这里我们以一个矩形为例子: 

#include <stdio.h>
#include <graphics.h>
int main()
{
	initgraph(1040, 600,SHOWCONSOLE);//设置图形边框
	setbkcolor(RED);//设置背景颜色
	cleardevice();//覆盖之前背景颜色
	setfillcolor(GREEN);//填充颜色

	fillrectangle(400, 200, 600, 300);//设置一个有边框矩形(边框默认白色)
	settextstyle(20, 0, "楷体");//设置字体样式
	settextcolor(YELLOW);//设置字体颜色
	setbkmode(TRANSPARENT);//设置字体背景颜色(透明)
	char arr[] = "俺在居中位置";//定义一个字符串
	int height = (100 - textheight(arr)) / 2;//计算空隙高度
	int width = (200 - textwidth(arr)) / 2;//计算空隙宽度
	outtextxy(400 + width, 200 + height, arr);//加上原先高宽,并输出字符串

		getchar();//接受图形
	closegraph();//关闭图形
	return 0;
}

9.图像处理函数 

Easyx也可以导入图片,在使用图像之前,我们需要定义一个(变量)对象,然后把图像加载进变量后才可以使用。定义图像用:IMAGE,如 IMAGE img ; 

  • loadimage (指针(&img),文件名,拉伸高度,拉伸长度,调整大小(一般不用管));
  • putimage( int x , int y ,指针(&img)) ;

 注意事项:

  1. 图片文件最后保存到与源代码相同目录的地方
  2. 取文件的时候使用 ./ 文件名(. / 是取当前文件目录,. / 是取上一级目录)
  3. JPG图像不支持透明背景 

         

 10.鼠标消息函数 

旧版:使用头文件#include <graphics.h>(建议使用旧版)

  • 首先还是需要定义鼠标消息类型:MOUSEMSG
  • MouseHit()用于判断是否有鼠标消息 
  • 用GetMouseMsg()接收消息
  • 注意使用循环判断鼠标消息

 可以结合上面的代码进行操作试验:(看看黑框框出现什么鸭)

	while (1)
	{
		if (MouseHit())
		{
			MOUSEMSG msg = GetMouseMsg();
			if (msg.mkLButton && msg.x >= 400 && msg.x <= 600 && msg.y >= 200 && msg.y <= 300)
			{
				printf("我被按下了\n");
			}

		}
	}

新版: 使用头文件#include <easyx.h>(跟graphics有一些不一样的地方,毕竟是新版)

 

  •  定义鼠标消息用:ExMessage
  • 用peekmessage(指针,消息类型)用于判断和接收鼠标消息
  • 注意用循环判断鼠标消息

11.键盘消息函数 (非Easyx函数)

下图为获取键盘消息的函数,有两种操作方式,建议使用第二个。

 

  •  因为又使用循环,所以我们经常把全部(全部图像)代码放进循环中
  • 循环会出现闪屏的情况,所以我们经常会使用另外的函数库避免闪屏现象:

tips:结束批量绘制建议使用 FlushBatchDraw ( ) ;

下面是我的一段参考代码:可实现小球移动 (也有之前的一些练习代码)

#include <stdio.h>
#include <graphics.h>
int main()
{
	int x = 50, y = 50;//定义小球初始位置

	initgraph(1040, 600, SHOWCONSOLE);//设置图形边框
	while (1)
	{
		BeginBatchDraw();//开始批量绘制
		setbkcolor(WHITE);//设置背景颜色
		cleardevice();//覆盖之前背景颜色
		setlinestyle(PS_SOLID, 2);//设置线条样式
		setlinecolor(RED);//设置线条颜色
		setfillcolor(GREEN);//填充颜色
		circle(100, 100, 50);
		fillcircle(200, 100, 50);
		solidcircle(300, 100, 50);

		fillrectangle(400, 200, 600, 300);//设置一个有边框矩形(边框默认白色)
		settextstyle(20, 0, "楷体");//设置字体样式
		settextcolor(YELLOW);//设置字体颜色
		setbkmode(TRANSPARENT);//设置字体背景颜色(透明)
		char arr[] = "按钮";//定义一个字符串
		int height = (100 - textheight(arr)) / 2;//计算空隙高度
		int width = (200 - textwidth(arr)) / 2;//计算空隙宽度
		outtextxy(400 + width, 200 + height, arr);//加上原先高宽,并输出字符串


		IMAGE img;//定义图像
		loadimage(&img,"./11.jpeg",250,250);//加载图片,图片你们自己选,这段代码可以删去
		putimage(0, 0, &img);//输出图片

	//int x = 50, y = 50;
		int v = 1;//定义速度v
		setfillcolor(BLUE);//设置小球颜色
		fillcircle(x, y, 10);//设置小球大小位置
		FlushBatchDraw();//结束批量绘制
		if (GetAsyncKeyState(VK_UP))//上移
			y -= v;
		if (GetAsyncKeyState(VK_DOWN))//下移
			y += v;
		if (GetAsyncKeyState(VK_LEFT))//左移
			x -= v;
		if (GetAsyncKeyState(VK_RIGHT))//右移
			x += v;
	}
		getchar();
		closegraph();
	
		return 0;
}

12.音乐播放函数 

 

  •  注意头文件中 mmsystem.h 和 winmm.lib 需要写在 graphics.h 的下面
  • 使用 mciSendString () 来打开和播放音乐,后面三个参数暂时不用管,都写 0
  • 还是建议把音乐文件放在与源代码相同目录的地方
  • 可对音乐文件取别名 alias +别名 
  • 在音乐后加上 repeat 重复播放音乐,不能使用while循环!!
  • 一般是使用函数播放音乐
  • 加载静态库:#pragma comment(lib,"winmm.lib")  (放在头文件里面)

13.其他函数 

  • 首先需要定义操作窗口类型:HWND 来定义窗口句柄,GetHWnd ( ) 获取句柄
  • 使用 SetWindowText ( 句柄,字符串(标题) ) 来修改窗口标题
  • 使用 MessageBox ( 句柄,消息框,标题,选项 ) 设置模态对话框

最后附上我的练习效果图: 

 

 最后附上我的代码:

#include <stdio.h>
#include <graphics.h>//EasyX图形库函数
#include <easyx.h>//都一样的,只不过是新版
#include <mmsystem.h>//播放音乐所需的头文件,需要放在graphics下面
#pragma comment(lib,"winmm.lib")//加载静态库
void bgm()
{
	mciSendString("open ./一半.mp3 alias bgm", 0, 0, 0);//打开音乐,薛之谦的一半
	mciSendString("play bgm", 0, 0, 0);//播放音乐
}
void change()
{
	HWND win = GetHWnd();//获取窗口句柄
	SetWindowText(win, "c语言练习-EasyX");//修改窗口标题
	MessageBox(win, "你爱我吗?", "快快回答",MB_YESNO);//设置模态对话框
}

int main()
{
	int x = 50, y = 50;//定义小球的初始位置

	initgraph(1040, 600, SHOWCONSOLE);//设置图形边框
	bgm();//播放音乐
	change();//弹窗与标题修改
	while (1)
	{
		BeginBatchDraw();//开始批量绘制,防止闪屏
		setbkcolor(WHITE);//设置背景颜色
		cleardevice();//覆盖之前背景颜色
		setlinestyle(PS_SOLID, 2);//设置线条样式,实线
		setlinecolor(RED);//设置线条颜色
		setfillcolor(GREEN);//填充颜色
		circle(100, 100, 50);
		fillcircle(200, 100, 50);
		solidcircle(300, 100, 50);

		fillrectangle(400, 200, 600, 300);//设置一个有边框矩形(边框默认白色)
		settextstyle(20, 0, "楷体");//设置字体样式
		settextcolor(YELLOW);//设置字体颜色
		setbkmode(TRANSPARENT);//设置字体背景颜色(透明)
		char arr[] = "按钮";//定义一个字符串
		int height = (100 - textheight(arr)) / 2;//计算空隙高度
		int width = (200 - textwidth(arr)) / 2;//计算空隙宽度
		outtextxy(400 + width, 200 + height, arr);//加上原先高宽,并输出字符串

		ExMessage msg;//定义鼠标消息
		if (peekmessage(&msg,EM_MOUSE))//判断与接收鼠标消息
		{
			if ( msg.lbutton && msg.x >= 400 && msg.x <= 600 && msg.y >= 200 && msg.y <= 300)//如果鼠标左键点击了矩形框
			{
				printf("我被按下了\n");
			}
		}

		IMAGE img;//定义图像
		loadimage(&img,"./11.jpeg",250,250);//加载图片,这是我自己的图片路径和名称
		putimage(700, 100, &img);//输出图片

		int v = 1;//定义速度
		setfillcolor(BLUE);//设置小球填充颜色为蓝色
		fillcircle(x, y, 10);//设置小球的位置(用变量表示)
		FlushBatchDraw();//结束批量绘制,防止闪屏
		if (GetAsyncKeyState(VK_UP))//上移
			y -= v;
		if (GetAsyncKeyState(VK_DOWN))//下移
			y += v;
		if (GetAsyncKeyState(VK_LEFT))//左移
			x -= v;
		if (GetAsyncKeyState(VK_RIGHT))//右移
			x += v;
	}
		getchar();
		closegraph();
	
		return 0;
}

14.总结

EasyX图形库函数很多,一次性记下来还是很难的,建议多动手做一下小项目和平时多实践用一下,这样记忆会牢固不少。最后恭喜大家摆脱了黑框框!!!

  • 31
    点赞
  • 207
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只特仑苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值