在之前的C语言中,我们的代码最终展示界面都是控制台,也就是那个黑框框,这确实不够高大上,因此EasyX就是来解决这个问题的。
Easy×是针对C++的图形库,可以帮助C/C++初学者快速上手图形和游戏编程。比如我们可以用这个东西画一个圆形,画一个汽车等物体,也可以用这个东西实现贪吃蛇、俄罗斯方块等游戏。
要用这个东西,我们就要用.cpp
文件而不是原来的 .c
文件。
EasyX在线文档的网址EasyX在线文档,在界面的右边可以调节中英文:
点击这里进入下载页面:
每次要使用EasyX中的图形编程函数,只需要引用头文件graphics.h
即可。
我们在这里表示颜色用三原色表示,也就是RGB
,分别为红、绿、蓝。
RGB(红色部分,绿色部分,蓝色部分);每个颜色部分的值都是从0~255
,比如画图工具中的:
图形编程并不会使用我们编译器的控制台,而是会另外生成一个新的窗口,这个窗口有一些属性:
坐标默认的原点在窗口的左上角,X轴向右为正,Y轴向下为正,度量单位是像素点。
如果要画图比如画一个圆形,都是需要XY坐标的。
在EasyX中,画图窗口分两种,一种是默认的绘图窗口,另一种是IMAGE对象。通SetWorkinglmage()函数可以设置当前用于绘图的设窗口。设置当前用于绘图的窗口后,所有的绘图函数都会绘制在该窗口上。
再次强调在使用这些函数之前一定要引用头文件#include
由于EasyX函数太多,因此这里只挑几个常用的说明一下,更多的函数可以前往EasyX文档查看使用。
设置窗口的操作要用到窗口函数,它的作用是设置窗口的宽度和高度,以及窗口的样式(比如没有关闭按键,没有最小化按键,控制台不打开),同时还会有关闭窗口函数和清空绘图窗口。
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;
}
绘图窗口创建完成,如果想改变绘图窗口的样式,只需要调整第三个参数即可:
如果想要调整背景颜色,只需要在初始化后加入这两条函数即可
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;
}
以画圆形为例,可以用三个不同的函数来画,效果也各有不同
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
);
void setlinecolor(COLORREF color);//用于设置画线的颜色
void setfillcolor(COLORREF color);//用于填充颜色
因此,我们可以用下面的代码比较三种圆的不同:
#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;
}
绘图函数太多,更多的绘图函数可以去文档中查找使用。
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);//设置展示字符串时的背景
outtextxy这个函数在使用时会因为字符集不匹配报错,有三种解决办法:
#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;
}
另外还有两个函数可以求字符串的像素宽度和高度
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;
}
在使用图片输出函数之前,需要先定义一个图片变量,把图片加载到里面才能使用。变量的类型是IMAGE
,将图片加载到变量的函数如下:
void loadimage(
IMAGE* pDstImg, // 保存图像的 IMAGE 对象指针
LPCTSTR pImgFile, // 路径+图片名+后缀
int nWidth = 0, // 图片的拉伸宽度
int nHeight = 0, // 图片的拉伸高度
bool bResize = false // 是否调整 IMAGE 的大小以适应图片
);
绘制图片的函数:
// 绘制图像
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)
{
;
}
}
鼠标操作需要使用鼠标类型EASYXMSG
,用函数getmessage();
获取鼠标消息。
通过这些命令可以实现类似于按钮的操作,比如下面的代码:
#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)
{
;
}
}
要使用头文件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 小键盘 0 键 0x60
VK_NUMPAD1 小键盘 1 键 0x61
VK_NUMPAD2 小键盘 2 键 0x62
VK_NUMPAD3 小键盘 3 键 0x63
VK_NUMPAD4 小键盘 4 键 0x64
VK_NUMPAD5 小键盘 5 键 0x65
VK_NUMPAD6 小键盘 6 键 0x66
VK_NUMPAD7 小键盘 7 键 0x67
VK_NUMPAD8 小键盘 8 键 0x68
VK_NUMPAD9 小键盘 9 键 0x69
VK_F1 - VK_F24 功能键F1 – F24 0x70 - 0x87
VK_NUMLOCK Num Lock 键 0x90
VK_SCROLL Scroll Lock 键 0x91
播放音乐需要的函数如下,头文件记得写:
#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;
}
HWND GetHWnd();//这个函数用于获取绘图窗口句柄。
具体使用方式如下:
void change()
{
//获取窗口句柄
HWND hnd = GetHWnd();
//设置窗口标题
SetWindowText(hnd, "测试标题");
//弹出窗口,提示用户操作
MessageBox(NULL, "游戏失败", "窗口标题", MB_OKCANCEL);
}
MB_OKCANCEL可以替换成其他变量:
替换以后出现不同选项,NULL也可以替换成句柄hnd,替换以后必须要先点击弹出窗口,才能再点击其他窗口。