番外篇:入门EasyX图形库(带你进入不一样的程序窗口,超详解)

前言

话不多说,来看一下我们都要了解什么吧!
在这里插入图片描述

一.安装EasyX

官网:请点击我进入
注意:EasyX 是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022

下载:在这里插入图片描述
安装后:在这里插入图片描述
注意:安装的会自动识别你已经安装的版本,点击安装即可,EasyX文档可以下也可以不下(区别是离线和在线),安装时最好退出你的vs。

安装好后我们就可以创建一个新项目了。

二.创建与关闭窗口

1.包含头文件

注意:设置的源文件为后缀.cpp

头文件:#include<graphics.h>

2.创建窗口与关闭窗口的函数

创建窗口函数:initgraph();
参数:
1.宽度
2.高度
关闭窗口函数:closegraph();
参数:无
注意:这里是函数执行后会立马关闭窗口,因此需要有个缓冲函数:getchar()让窗口得以持续显示。

代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>//getchar的头文件
int main()
{
	initgraph(520, 520);//宽520,高520.
	getchar();
	closegraph();
	return 0;
}

效果
在这里插入图片描述
这时我们就创建好一个窗口了!不过现在有点单调,需要再添加一些元素,慢慢来。

3.窗口的坐标原理

我们应该都学过建立平面直角坐标系,那这里的坐标系是如何建立的呢?
看下图:
在这里插入图片描述

注意:请记住这里的坐标原点在窗口名字的正下方。

4.设置背景颜色

看着这一团黑色,不利于画图这里就要借助于设置背景的函数。
函数:setbkcolor();
参数:颜色
这里白色适合画图我们就用白色吧!但是上次默认的黑色还在我们要清除一下,要用到一个函数。
函数:cleardevice();
参数:无
功能:使用当前背景色清空绘图设备
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
这白不白?

三.基本图形的绘制

1.圆形(空心)

函数:circle();
参数:
1.圆心的横坐标
2.圆心的纵坐标
3.圆的半径
代码实现:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	//画一个圆
	circle(50, 50, 50);
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
这是为啥?难道是因为颜色相同覆盖了?
我们论证一下:
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(BLACK);//设置背景为黑色
	cleardevice();
	//画一个圆
	circle(50, 50, 50);
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
还真是,那如果我们要在白色背景下,画一个圆该咋办呢?
这就用到设置线条的函数了。
函数:setlinecolor()
参数:颜色
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	setlinecolor(BLACK);
	//画一个圆
	circle(50, 50, 50);
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述

2.有边框的实心圆

函数:fillcircle();
参数:
1.圆心的横坐标
2.圆心的纵坐标
3.圆的半径
写一下代码:


#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	setlinecolor(BLACK);
	//画一个圆
	circle(50, 50, 50);
	fillcircle(50, 150, 50);//有边框
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
这里因为圆的背景色是白色,所以看起来没有填充,so我们来设计一下。
函数:setfillcolor()
参数:颜色
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	setlinecolor(BLACK);
	setfillcolor(BLUE);
	//画一个圆
	circle(50, 50, 50);
	fillcircle(50, 150, 50);//有边框
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述

3.无边框的实心圆

函数:solidcircle();
参数:
1.圆心的横坐标
2.圆心的纵坐标
3.圆的半径
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);//设置一个窗口
	setbkcolor(WHITE);//设置背景色
	cleardevice();//用背景色覆盖窗口
	setlinecolor(BLACK);//设置图形线条颜色
	setfillcolor(BLUE);//设置图形填充颜色
	//画一个圆
	circle(50, 50, 50);
	fillcircle(50, 150, 50);//有边框
	solidcircle(50, 250, 50);//无边框
	getchar();//缓冲
	closegraph();//关闭窗口
	return 0;
}

效果:
在这里插入图片描述

四.文字的打印

1.准备事项

在这里插入图片描述
在这里插入图片描述
准备完成!这里是为了更好的使用打印文字的函数。

2.打印文字

函数:outtextxy();
参数:
1.文字的横坐标
2.文字的纵坐标
3.文字的内容
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>

int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	outtextxy(100, 100, "谢谢观众老爷,赏脸看shun_hua的博客");
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
还是刚才那个问题,文字的颜色默认为白色,因此我们需设置字体颜色。
函数:settextcolor()
参数:颜色
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>

int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	settextcolor(RED);//文字格式为红色
	outtextxy(100, 100, "谢谢观众老爷,赏脸看shun_hua的博客");

	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述

3.设置文字格式

函数:settextstyle()
参数:
1.字符的大小
2.字符的字宽,如果为0则自动匹配
3.字符的形式,比如楷体,宋体
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>

int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	settextcolor(RED);//文字格式为红色
	settextstyle(20, 0, "楷体");//文字的大小,紧凑程度,字体的样式
	outtextxy(100, 100, "谢谢观众老爷,赏脸看shun_hua的博客");

	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
这样是不是好看多了?

3.设置当前字体的颜色

函数:setcolor()
参数:颜色
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	settextcolor(RED);//文字格式为红色
	settextstyle(20, 0, "楷体");//文字的大小,紧凑程度,字体的样式
	setcolor(GREEN);
	//setcolor(RGB(70, 127, 50));
	outtextxy(100, 100, "谢谢观众老爷,赏脸看shun_hua的博客");
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
注意:RGB()里面的三个参数为色素点。
在这里插入图片描述

4.设置字体的背景

因为字体的背景默认为白色会掩盖其他物体,所以我们为了不掩盖,可以改变字体的背景为透明色。
函数:setbkmode()
参数:颜色
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	settextcolor(RED);//文字格式为红色
	settextstyle(20, 0, "楷体");//文字的大小,紧凑程度,字体的样式
	setcolor(GREEN);
	setbkmode(TRANSPARENT);
	outtextxy(100, 100, "谢谢观众老爷,赏脸看shun_hua的博客");
	getchar();
	closegraph();
	return 0;
}

效果:
前:在这里插入图片描述
后:
在这里插入图片描述

5.文字在图形的居中显示

我们需要一个长方形,以便更好地显示。
函数:fillrectangle()
参数:
1.矩形左部 x 坐标
2.矩形顶部 y 坐标
3.矩形右部 x 坐标
4.矩形底部 y 坐标
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	settextcolor(RED);//文字格式为红色
	settextstyle(20, 0, "楷体");//文字的大小,紧凑程度,字体的样式
	setcolor(GREEN);
	setbkmode(TRANSPARENT);
	fillrectangle(100, 100, 500, 500);
	outtextxy(100, 100, "谢谢观众老爷,赏脸看shun_hua的博客");
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
居中显示的原理:

在这里插入图片描述
cdceaa85.png)
注意:这里矩形的高为底部y坐标减去顶部y坐标,矩形的宽为右边x坐标减去左边x坐标。
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
int main()
{
	initgraph(520, 520);
	setbkcolor(WHITE);
	cleardevice();
	settextcolor(RED);//文字格式为红色
	settextstyle(20, 0, "楷体");//文字的大小,紧凑程度,字体的样式
	setcolor(GREEN);
	setbkmode(TRANSPARENT);
	fillrectangle(100, 100, 500, 500);
	//求字体的宽度与高度
	char arr[] = "谢谢观众老爷,赏脸看shun_hua的博客";
	int width = textwidth(arr);
	int height = textheight(arr);
    //求所加坐标的值
	//所加x坐标的值
	int x = (500 - 100) / 2 - width / 2;
	//所加y坐标的值
	int y = (500 - 100) / 2 - height / 2;
	outtextxy(100+x, 100+y, "谢谢观众老爷,赏脸看shun_hua的博客");
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述

五.键盘信息

1.获取键盘信息

函数:_kbhit()——布尔类型
头文件:conio.h
参数:无

2.输出键盘信息

函数:_getch()
头文件:conio.h

3.移动一个球

代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
int main()
{
	initgraph(520, 520,SHOWCONSOLE);//这里的第三个参数为显示控制台窗口
	setbkcolor(WHITE);
	int x = 200, y = 300;
	while (1)
	{
		cleardevice();
		setfillcolor(RED);
		solidcircle(x, y, 50);
		if (_kbhit())
		{
			char key = _getch();
			printf("%d %c\n", key, key);//可以获取键的ASCII值
			switch (key)
			{
			case 72://上键的ASCII值
				y -= 5;
				break;
			case 80://下键的ASCII值
				y += 5;
				break;
			case 75://左键的ASCII值
				x -= 5;
				break;
			case 77://右键的ASCII值
				x += 5;
				break;
			}
		}
	}
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
缺点:会出现闪屏的现象,并且由于switch的性质,无法斜着进行移动。

解决方法;

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
int main()
{
	initgraph(520, 520,SHOWCONSOLE);
	setbkcolor(WHITE);
	int x = 200, y = 300;
	BeginBatchDraw();//这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出
	//到绘图窗口上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。

void BeginBatchDraw();
	while (1)
	{
		cleardevice();

		setfillcolor(RED);
		solidcircle(x, y, 50);
		FlushBatchDraw();//这个函数用于执行未完成的绘制任务。比EndBatchDraw更稳定
		//四个if为四个接口,可以斜向上移动,并且更加丝滑。
		if (GetAsyncKeyState(VK_UP))
		{
			y--;
		}
		if (GetAsyncKeyState(VK_DOWN))
		{
			y++;
		}
		if (GetAsyncKeyState(VK_LEFT))
		{
			x--;
		}
		if (GetAsyncKeyState(VK_RIGHT))
		{
			x++;
		}
	}
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述

六.鼠标信息

1.判断有无鼠标信息

函数:MouseHit()——布尔类型
参数:无参

2.读取鼠标信息

鼠标信息的类型:MOUSEMSG
定义变量(举例):MOUSEMSG msg;
读取鼠标信息的函数:GetMouseMsg()

3.消息处理

msg.uMsg将变量进行处理转变为常变量(猜测)
WM_LBUTTONDOWN——鼠标左键
WM_RBUTTONDOWN——鼠标右键
msg.x获取鼠标的横坐标
msg.y获取鼠标的纵坐标
代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
int main()
{
	initgraph(520, 520,SHOWCONSOLE);
	setbkcolor(BLACK);
	cleardevice();
	while (1)
	{
		if (MouseHit())
		{
			MOUSEMSG msg = GetMouseMsg();
			switch (msg.uMsg)
			{

			 case WM_LBUTTONDOWN:
				outtextxy(200, 200, "鼠标左键");
				printf("坐标(%d,%d)", msg.x, msg.y);
				break;
			 case WM_RBUTTONDOWN:
				outtextxy(100, 100, "鼠标右键");
				printf("坐标(%d,%d)", msg.x, msg.y);
				break;
			}
		}
	}
	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述

七.插入图片

1.定义图片变量

图片类型:IMAGE
定义:IMAGE mage;

2.读取图片

函数:loadimage()
参数:
1.图片地址
2.图片文件夹——./为当前文件目录。

3.加载图片

函数:putimage()
参数:
1.图片的横坐标
2.图片的纵坐标
3.图片地址
代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
int main()
{
	initgraph(2000, 2000,SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();
	IMAGE mage;
	loadimage(&mage, "2.jpg");
	putimage(0, 0, &mage);
	getchar();
	closegraph();
	return 0;
}

注意:要看一下自己图片与窗口的大小,以达到自己预期的效果。
效果:
在这里插入图片描述

八.播放音乐

1.读取音乐

函数:mciSendString()
头文件:mmsystem.h
预处理指令:#pragma comment(lib,“winmm.lib”)

2.播放与关闭音乐

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<mmsystem.h>//包含多媒体接口
#pragma comment(lib,"winmm.lib")//处理接口
void BGM()
{
   //文件为.mp3为后缀才可播放,要把音乐拷贝到项目所在文件夹里
	mciSendString("open ./ww.mp3", 0, 0, 0);//0,0,0为默认输出控制台
	mciSendString("play ./ww.mp3", 0, 0, 0);
	if (0)
	{
		mciSendString("close ./ww.mp3",0, 0, 0);
	}
}
int main()
{
	initgraph(500, 500,SHOWCONSOLE);
	setbkcolor(WHITE);
 	cleardevice();
	BGM();
	getchar();
	closegraph();
	return 0;
}

效果是一段音乐。

九.窗口的设置

1.设置图形窗口

窗口类型:HWND
窗口定义:HWND hand;
函数:GetHWnd()
功能:获取窗口信息
函数:SetWindowTex
功能:设置窗口内容
参数:1.类型变量名 2.修改内容

2.设置提示窗口

函数:MessageBox
功能:设置窗口内容
参数:1.类型变量名 2.修改内容
代码:

#include<conio.h>
#include<mmsystem.h>//包含多媒体接口
#pragma comment(lib,"winmm.lib")
void BGM()
{

	mciSendString("open ./ww.mp3", 0, 0, 0);//默认输出控制台
	mciSendString("play ./ww.mp3", 0, 0, 0);
	if (0)
	{
		mciSendString("close ./ww.mp3",0, 0, 0);
	}
}
void change()
{
	HWND hand = GetHWnd();
	SetWindowText(hand, "欢迎来到我的博客");
	int i = MessageBox(hand, "请留下你的三连", "提示",MB_OKCANCEL);
	if (IDOK == i)
	{
		printf("谢谢大佬!");
	}
	else if (IDCANCEL == i)
	{
		printf("感谢您的观看!");
	}
}
int main()
{
	initgraph(500, 500,SHOWCONSOLE);
	setbkcolor(WHITE);

	cleardevice();
	change();

	getchar();
	closegraph();
	return 0;
}

效果:
在这里插入图片描述
在这里插入图片描述

十、实战篇

扫雷(进阶版——图形化界面,递归展开,播放音乐与音效,标记取消雷,记录雷的个数,鼠标点击,文末附有完整代码)

看很多小伙伴,也在看这篇文章,刚好和这篇有关系,就放在这里了~

总结

如果能认真看到这里,我坚信你能收获很多很多!也希望这篇文章能帮助到你,如果觉得不错,请点击一下不要钱的赞,如果有误请温柔的指出,在这里感谢大家了!

评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值