EasyX图形编程

在之前的C语言中,我们的代码最终展示界面都是控制台,也就是那个黑框框,这确实不够高大上,因此EasyX就是来解决这个问题的。


文章目录

  • 一、EasyX简单介绍
    • 1.1EasyX安装
    • 1.2图形编程前需要了解的一些概念
      • 1.2.1三原色
      • 1.2.2图形编程的窗口
  • 二、EasyX函数介绍
    • 2.1设置窗口
    • 2.2绘图函数
    • 2.3输出文字的函数
    • 2.4输出图片的函数
    • 2.5鼠标操作
  • 三、非EasyX函数
    • 3.1键盘消息函数
    • 3.2播放音乐的函数
    • 3.3如何修改窗口标题


一、EasyX简单介绍

Easy×是针对C++的图形库,可以帮助C/C++初学者快速上手图形和游戏编程。比如我们可以用这个东西画一个圆形,画一个汽车等物体,也可以用这个东西实现贪吃蛇、俄罗斯方块等游戏。

要用这个东西,我们就要用.cpp文件而不是原来的 .c文件。

1.1EasyX安装

EasyX在线文档的网址EasyX在线文档,在界面的右边可以调节中英文:
EasyX图形编程_第1张图片
点击这里进入下载页面:
EasyX图形编程_第2张图片

点击下载:
EasyX图形编程_第3张图片
下载完成以后打开并选择对应版本安装:
EasyX图形编程_第4张图片

提示安装成功以后,安装完成:
EasyX图形编程_第5张图片

每次要使用EasyX中的图形编程函数,只需要引用头文件graphics.h即可。

1.2图形编程前需要了解的一些概念

1.2.1三原色

我们在这里表示颜色用三原色表示,也就是RGB,分别为红、绿、蓝。
RGB(红色部分,绿色部分,蓝色部分);每个颜色部分的值都是从0~255,比如画图工具中的:
EasyX图形编程_第6张图片

1.2.2图形编程的窗口

图形编程并不会使用我们编译器的控制台,而是会另外生成一个新的窗口,这个窗口有一些属性:
坐标默认的原点在窗口的左上角,X轴向右为正,Y轴向下为正,度量单位是像素点。
EasyX图形编程_第7张图片

如果要画图比如画一个圆形,都是需要XY坐标的。

在EasyX中,画图窗口分两种,一种是默认的绘图窗口,另一种是IMAGE对象。通SetWorkinglmage()函数可以设置当前用于绘图的设窗口。设置当前用于绘图的窗口后,所有的绘图函数都会绘制在该窗口上。


二、EasyX函数介绍

再次强调在使用这些函数之前一定要引用头文件#include
由于EasyX函数太多,因此这里只挑几个常用的说明一下,更多的函数可以前往EasyX文档查看使用。

2.1设置窗口

设置窗口的操作要用到窗口函数,它的作用是设置窗口的宽度和高度,以及窗口的样式(比如没有关闭按键,没有最小化按键,控制台不打开),同时还会有关闭窗口函数和清空绘图窗口。

initgraph(int width,int height,int flag=NULL)//用于创建窗口
//width指定窗口的宽度 height指定窗口的高度
//flag窗口的样式,如果不写则为NULL

closegraph();//关闭绘图窗口
cleardevice();//清空绘图设备
//在窗口运行结束后加入这俩函数

比如要打开一个宽640,高480的图形窗口就可以这样写:

#include
#include //包含图形库头文件
int main()
{
    // 初始化绘图窗口,宽度和高度
    initgraph(640,480);

    while (1)
    {
        ;
    }//如果不加死循环,则会打开后立刻就关闭
    closegraph();//关闭绘图窗口
    cleardevice();//清空绘图设备
    
    return 0;
}

程序运行以后会发现控制台消失了,只剩下一个绘图窗口:
EasyX图形编程_第8张图片

绘图窗口创建完成,如果想改变绘图窗口的样式,只需要调整第三个参数即可:

EasyX图形编程_第9张图片

如果想要调整背景颜色,只需要在初始化后加入这两条函数即可

 void setbkcolor(COLORREF color);//设备绘图背景色
 void cleardevice();//清除之前的黑色,使用当前颜色

COLORREF color这个参数可以使用RGB来赋值,也可以使用YELLOW,GREEN,WHITE这种表示颜色的大写字母直接赋值,比如下面的代码:

#include
#include //包含图形库头文件
int main()
{
    // 初始化绘图窗口,宽度和高度
    initgraph(640,480);
    COLORREF cf = RGB(100,100,0);
    setbkcolor(cf);
    cleardevice();
    while (1)
    {
        ;
    }//如果不加死循环,则会打开后立刻就关闭
    closegraph();//关闭绘图窗口
    cleardevice();//清空绘图设备
    
    return 0;
}

EasyX图形编程_第10张图片

2.2绘图函数

以画圆形为例,可以用三个不同的函数来画,效果也各有不同

void circle(int x,int y,int radius);//圆心x坐标,圆心y坐标,圆半径radius  绘制无填充的圆

void fillcircle(int x,int y,int radius);//与上面的情况相同,但是该函数绘制有填充和边框的圆

void solidcircle(int x,int y,int radius);//与第一个相同,但该函数绘制有填充的无边框圆

在展示这三个函数不同区别之前,再介绍一下画线函数和填充颜色的函数:

void setlinestyle(//用于画不同的线
	int style,
	int thickness = 1,
	const DWORD *puserstyle = NULL,
	DWORD userstylecount = 0
);

EasyX图形编程_第11张图片

void setlinecolor(COLORREF color);//用于设置画线的颜色

EasyX图形编程_第12张图片

 void setfillcolor(COLORREF color);//用于填充颜色

EasyX图形编程_第13张图片

因此,我们可以用下面的代码比较三种圆的不同:

#include //包含图形库头文件
int main()
{
    // 初始化绘图窗口,宽度和高度
    initgraph(640,480);
    COLORREF cf = RGB(100,100,0);
    setbkcolor(cf);
    cleardevice();


    setlinestyle(PS_SOLID, 10);//设置线条样式
    setfillcolor(YELLOW);//设置填充颜色
    setlinecolor(BLUE);//设置线条颜色
    circle(50, 50, 50);//无填充圆有边框
    fillcircle(50, 150, 50);//有填充有边框圆
    solidcircle(50, 250, 50);  //无边框有填充圆
    while (1)
    {
        ;
    }
    closegraph();//关闭绘图窗口
    cleardevice();//清空绘图设备

    return 0;
}

EasyX图形编程_第14张图片

绘图函数太多,更多的绘图函数可以去文档中查找使用。

2.3输出文字的函数

void outtextxy(
	int x,
	int y,
	LPCTSTR str
);

这个函数可以在指定的位置输出指定的字符串。
当然,字符串的颜色和大小也是可以改变的:

void settextcolor(COLORREF color);//设置字符串颜色

与填充颜色的函数类似,这个函数可以修改字符串的颜色。

void settextstyle(
	int nHeight,//高度
	int nWidth,//宽度,如果是0,则表示自适应
	LPCTSTR lpszFace//字体名称
);

通过这个函数改变字体

void setbkmode(int mode);//设置展示字符串时的背景

EasyX图形编程_第15张图片

outtextxy这个函数在使用时会因为字符集不匹配报错,有三种解决办法:

  1. 在字符串前面加上大写的L,但这个方法对字符数组没用。
  2. 用TEXT()或_T()将字符串括起来,这个方法对字符数组也不适用
  3. 在文件开头加上#undef UNICODE #undef _UNICODE,这个方法对字符串和字符数组都适用,推荐这个方法。

下面使用程序进行演示效果:

#undef UNICODE
#undef _UNICODE
#include //包含图形库头文件
int main()
{
    // 初始化绘图窗口,宽度和高度
    initgraph(640,480);
    COLORREF cf = RGB(100,100,0);
    setbkcolor(cf);
    cleardevice();


    setlinestyle(PS_SOLID, 10);
    setfillcolor(YELLOW);
    setlinecolor(BLUE);
    circle(50, 50, 50);
    fillcircle(50, 150, 50);
    solidcircle(50, 250, 50);

    char arr[10] = "abcd";
    settextcolor(BLUE);
    settextstyle(50, 0, "宋体");
    setbkmode(TRANSPARENT);
    outtextxy(50, 100,arr);
    outtextxy(50, 150, "测试字符串"); 
    while (1)
    {
        ;
    }
    closegraph();//关闭绘图窗口
    cleardevice();//清空绘图设备 
    return 0;
}

EasyX图形编程_第16张图片

另外还有两个函数可以求字符串的像素宽度和高度

int textheight(LPCTSTR str);//用于获取字符串实际占用的像素高度。
int textwidth(LPCTSTR str);//用于获取字符串实际占用的像素宽度。

通过这两个函数可以让字符串的居中对齐:

#undef UNICODE
#undef _UNICODE
#include //包含图形库头文件

int main()
{
    // 初始化绘图窗口,宽度和高度
    initgraph(640,480);
    setbkcolor(RGB(203, 221, 244));
    cleardevice();

     setfillcolor(YELLOW);
    fillrectangle(200, 50, 500, 100);
    settextcolor(RGB(155, 0, 15));
    char arr[] = "测试字符串";
    int width = 300 / 2 - textwidth(arr)/2;
    int height = 50 / 2 - textheight(arr) / 2;
    setbkmode(TRANSPARENT);
    outtextxy(width + 200, height + 50, arr);

  
    while (1)
    {
        ;
    }
    closegraph();//关闭绘图窗口
    cleardevice();//清空绘图设备
    return 0;
}

EasyX图形编程_第17张图片

2.4输出图片的函数

在使用图片输出函数之前,需要先定义一个图片变量,把图片加载到里面才能使用。变量的类型是IMAGE,将图片加载到变量的函数如下:

void loadimage(
	IMAGE* pDstImg,			// 保存图像的 IMAGE 对象指针
	LPCTSTR pImgFile,		// 路径+图片名+后缀
	int nWidth = 0,			// 图片的拉伸宽度
	int nHeight = 0,		// 图片的拉伸高度
	bool bResize = false	// 是否调整 IMAGE 的大小以适应图片
);

EasyX图形编程_第18张图片

绘制图片的函数:

// 绘制图像
void putimage(
	int dstX,				// 绘制位置的 x 坐标
	int dstY,				// 绘制位置的 y 坐标
	IMAGE *pSrcImg,			// 要绘制的 IMAGE 对象指针
	DWORD dwRop = SRCCOPY	// 三元光栅操作码
);
// 绘制图像(指定宽高和起始位置)
void putimage(
	int dstX,				// 绘制位置的 x 坐标
	int dstY,				// 绘制位置的 y 坐标
	int dstWidth,			// 绘制的宽度
	int dstHeight,			// 绘制的高度
	IMAGE *pSrcImg,			// 要绘制的 IMAGE 对象指针
	int srcX,				// 绘制内容在 IMAGE 对象中的左上角 x 坐标
	int srcY,				// 绘制内容在 IMAGE 对象中的左上角 y 坐标
	DWORD dwRop = SRCCOPY	// 三元光栅操作码
);

这两个绘制函数都可以。
下面是代码展示:

int main()
{

	    // 初始化绘图窗口,宽度和高度
	initgraph(640,480);
	setbkcolor(RGB(203, 221, 244));
    cleardevice();
	IMAGE img;//定义一个变量
	//相对路径./当前目录 ../上一级目录
	//绝对路径
	loadimage(&img, "C:\\Users\\86185\\Pictures\\Saved Pictures\\ac910b4971.jpg",640,480);
	putimage(0, 0, &img);

	while (1)
		    {
		        ;
		    }

}

EasyX图形编程_第19张图片

2.5鼠标操作

鼠标操作需要使用鼠标类型EASYXMSG,用函数getmessage();获取鼠标消息。
EasyX图形编程_第20张图片EasyX图形编程_第21张图片

通过这些命令可以实现类似于按钮的操作,比如下面的代码:

#include //包含图形库头文件
#include
int main()
{
	initgraph(640, 480,EW_SHOWCONSOLE);
	setbkcolor(RGB(203, 221, 244));
	 cleardevice();

	setfillcolor(YELLOW);
    fillrectangle(200, 50, 500, 100);
    settextcolor(RGB(155, 0, 15));
    char arr[] = "测试字符串";
    int width = 300 / 2 - textwidth(arr)/2;
    int height = 50 / 2 - textheight(arr) / 2;
    setbkmode(TRANSPARENT);
    outtextxy(width + 200, height + 50, arr);

	while (1)
	{
		  EASYXMSG msg = getmessage();
		switch (msg.message)
		{
		case WM_LBUTTONDOWN://左键点击
			if (msg.x > 200 && msg.x < 500 && msg.y>50 && msg.y < 100)
			{
				printf("左键点击了这块区域");
			}
			outtextxy(400, 400, "左键点击");
		case WM_RBUTTONDOWN:
			outtextxy(400, 400, "右键点击");
		}
		MOUSEMSG
	}


	while (1)
		    {
		        ;
		    }

}

EasyX图形编程_第22张图片


三、非EasyX函数

3.1键盘消息函数

要使用头文件conio.h

getch()与getchar()类似,但是getch()不需要回车就能输入,如果是上下左右等非ASCII码字符按键时,则使用虚拟键值,其中
上:72
下:80
左:75
右:77

GetAsyncKeyState()函数在使用时需要传入一个键值,如果相同则返回真,不同则返回假,部分键值如下:

VK_LBUTTON             鼠标左键                      0x01
VK_RBUTTON             鼠标右键                      0x02
VK_CANCEL              Ctrl + Break                  0x03
VK_MBUTTON             鼠标中键                      0x04

VK_BACK                Backspace 键       0x08
VK_TAB                 Tab 键                        0x09

VK_RETURN              回车键                        0x0D


VK_SHIFT               Shift 键                      0x10
VK_CONTROL             Ctrl 键                       0x11
VK_MENU                Alt 键                 0x12
VK_PAUSE               Pause 键                      0x13
VK_CAPITAL             Caps Lock 键                  0x14

VK_ESCAPE              Esc 键                        0x1B

VK_SPACE               空格键         0x20
VK_PRIOR               Page Up 键                    0x21
VK_NEXT                Page Down 键                  0x22
VK_END                 End 键                        0x23
VK_HOME                Home 键                       0x24
VK_LEFT                左箭头键                      0x25
VK_UP                  上箭头键                      0x26
VK_RIGHT               右箭头键                      0x27
VK_DOWN                下箭头键                      0x28
VK_SNAPSHOT            Print Screen 键               0x2C
VK_Insert              Insert 键                     0x2D
VK_Delete              Delete 键                     0x2E

'0''9'             数字 0 - 9                    0x30 - 0x39
'A''Z'             字母 A - Z                    0x41 - 0x5A

VK_LWIN                左WinKey(104键盘才有)         0x5B
VK_RWIN                右WinKey(104键盘才有)         0x5C
VK_APPS                AppsKey(104键盘才有)          0x5D

VK_NUMPAD0            小键盘 00x60
VK_NUMPAD1            小键盘 10x61
VK_NUMPAD2            小键盘 20x62
VK_NUMPAD3            小键盘 30x63
VK_NUMPAD4            小键盘 40x64
VK_NUMPAD5            小键盘 50x65
VK_NUMPAD6            小键盘 60x66
VK_NUMPAD7            小键盘 70x67
VK_NUMPAD8            小键盘 80x68
VK_NUMPAD9            小键盘 90x69

VK_F1 - VK_F24        功能键F1 – F24               0x70 - 0x87

VK_NUMLOCK            Num Lock 键                   0x90
VK_SCROLL             Scroll Lock 键                0x91

3.2播放音乐的函数

播放音乐需要的函数如下,头文件记得写:

#include
#include
#undef UNICODE
#undef _UNICODE
#pragma comment(lib,"Winmm.lib")
int main()
{
	mciSendString("open 1.mp3 alias bkmusic", NULL, 0, NULL);//alias取别名
	//1.mp3是文件的路径和文件名以及后缀,与上面的图片路径类似
	mciSendString("play bkmusic repeat", NULL, 0, NULL);     //循环播放音乐
      
      //mciSendString("close bkmusic repeat", NULL, 0, NULL);   停止播放
	system("pause");
	return 0;
}

3.3如何修改窗口标题

HWND GetHWnd();//这个函数用于获取绘图窗口句柄。

具体使用方式如下:

void change()
{
    //获取窗口句柄
    HWND hnd = GetHWnd();
    //设置窗口标题
    SetWindowText(hnd, "测试标题");
    //弹出窗口,提示用户操作
    MessageBox(NULL, "游戏失败", "窗口标题", MB_OKCANCEL);
}

MB_OKCANCEL可以替换成其他变量:
EasyX图形编程_第23张图片
替换以后出现不同选项,NULL也可以替换成句柄hnd,替换以后必须要先点击弹出窗口,才能再点击其他窗口。

创建窗口以后加上这个函数即可:
EasyX图形编程_第24张图片

你可能感兴趣的:(C语言,c语言,c++)