此图形库是针对C++的图形库,可以帮助初学者制作简单的图形以及游戏编程。本人也是一名语言的初学者,目的想记录学习的历程以及基本使用方法。
下载和安装在此不作说明,本文是以使用手册为基准,对函数的一些使用和注意事项进行说明。
基本上都是以画一个⚪为例。
#include // 引用图形库头文件
#include
int main()
{
initgraph(640, 480); // 创建绘图窗口,大小为 640x480 像素(单位是像素)
circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100
_getch(); // 按任意键继续目的是让窗体停下来
closegraph(); // 关闭绘图窗口
return 0;
}
好了这就是我们第一个代码。
#include
int main()
{
initgraph(640, 480);创建窗口大小
system("pause");//另一种使窗口停住的方法
closegraph();//关闭窗口
return 0;
}
然后我们右击函数名转到定义
HWND initgraph(int width, int height, int flag = NULL); // 初始化图形环境
void closegraph(); // 关闭图形环境
可以看见这个,initgraph()函数还有一个参数也可以不写。
打开手册可以发现:
创建窗口时还可以同时设置并且用 | 间隔可以同时设置,具体看代码
#include
#include
#include<
int main()
{
//initgraph(640, 480,EW_SHOWCONSOLE);//在创建窗口时显示控制台
initgraph(640, 480, EW_SHOWCONSOLE | EW_NOCLOSE | EW_NOMINIMIZE);//在显示控制台同时禁止关闭和最小化
_getch();
closegraph();//关闭窗口
return 0;
}
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(RED);//设置背景为红色
cleardevice();//用背景色清空屏幕
_getch();
closegraph();//关闭窗口
return 0;
}
设置背景时还需要使用cleardevise()函数当前背景色清空绘图设备,这样才能设置。注意先后顺序,一般设置颜色要放在操作之前。
颜色的表示:一般有颜色常量,16进制数字,RGB宏
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(RED);//设置背景为红色
cleardevice();//用背景色清空屏幕
//setfillcolor(WHITE);//设置当前设备填充颜色白色
//setfillcolor(RGB(200, 200, 200));//RGB宏大小0~255
setfillcolor(0xAAAAAA);
solidcircle(40, 40, 30);//白色无边框有填充的圆
_getch();
closegraph();//关闭窗口
return 0;
}
无边框无填充circle();
有边框有填充fillcircle();
无边框有填充solidcircle();
前两个参数是坐标 后一个是半径大小*
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(BLACK);
circle(40, 50, 30);//无边框无填充的圆
setfillcolor(RED);//填充颜色红色
setlinestyle(PS_SOLID , 4);//边框是线宽度4个像素 线的样式为实线
setlinecolor(BLUE);//边框的颜色是蓝色
fillcircle(100, 100, 30);//有边框的填充圆
solidcircle(100, 200, 30);//无边框的填充圆
_getch();
closegraph();//关闭窗口
return 0;
}
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setfillcolor(RED);//填充颜色红色
setlinestyle(PS_SOLID , 40);//边框是线 线的样式为实线
setlinecolor(BLUE);//边框的颜色是蓝色
fillcircle(100, 100, 30);//有边框的填充圆
clearcircle(100, 100, 20);//清空圆形区域(100,100)圆心半径20
_getch();
closegraph();//关闭窗口
return 0;
}
注意:该函数使用背景色清空圆形区域。
画图就是画线可以通过设置线的函数来设置图形边框
无填充矩形rectangle();
无边框的填充矩形solidrectangle();
有边框的填充矩形fillrectangle();
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setfillcolor(RED);//填充颜色红色
setlinestyle(PS_SOLID , 4);//边框是线 线的样式为实线
setlinecolor(BLUE);//边框的颜色是蓝色
rectangle(20, 20, 40, 70);//起点(20,20)终点(40,70)的矩形无填充
setfillcolor(RED);
fillrectangle(60, 20, 80, 70);//有边框的填充矩形
solidrectangle(100, 20, 120, 70);//无边框的填充矩形
_getch();
closegraph();//关闭窗口
return 0;
}
用法同上简单示例:
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
setfillcolor(RED);
fillrectangle(60, 20, 80, 70);//有边框的填充矩形
clearrectangle(65, 30, 80, 50);//清空矩形区域 坐标用法一样
_getch();
closegraph();//关闭窗口
return 0;
}
无填充的椭圆ellipse()
有边框有填充椭圆fillellipse()
无边框有填充椭圆solidellipse()
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
setfillcolor(RED);
ellipse(50, 50, 80,150);//椭圆外切圆矩形坐标 无填充
fillellipse(110, 50, 140, 150);//有边框有填充椭圆
solidellipse(170, 50, 200, 150);//无边框有填充
_getch();
closegraph();//关闭窗口
return 0;
}
用法一样:
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
setfillcolor(RED);
fillellipse(110, 50, 140, 150);//有边框有填充椭圆
clearellipse(110, 75, 140, 125);//清空椭圆区域
_getch();
closegraph();//关闭窗口
return 0;
}
无填充扇形pie()
有边框有填充扇形fillpie()
无边框填充扇形solidpie()
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
setfillcolor(RED);
pie(40, 40, 80, 100, 1, 1.5);//无填充扇形
fillpie(100, 40, 140, 100, 1, 1.5);//有边框有填充扇形
solidpie(160, 40, 200, 100, 1, 1.5);//无边框有填充扇形
_getch();
closegraph();//关闭窗口
return 0;
}
扇形有六个参数,前面四个是以椭圆外切矩形的顶点,后面是起终角的弧度(double),以矩形中心点做水平垂直线,水平右侧->0弧度,垂直向上即水平右侧逆时针方向->1.57弧度(90度),画的扇形也是以矩形中点为心
同上:
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
setlinestyle(PS_SOLID,6);
setfillcolor(RED);
fillpie(40, 40, 140, 140, 0, 3.14);//有边框有填充扇形
clearpie(40, 40, 140, 140, 0.78, 2.35);//清空扇形区域
_getch();
closegraph();//关闭窗口
return 0;
}
椭圆弧参数和扇形相似,使用方法同上
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
arc(40, 40, 80, 100, 4.01, 5.41);//画一个椭圆弧
_getch();
closegraph();//关闭窗口
return 0;
}
无填充多边形polygon()
有边框有填充的fillpolygon()
无边框有填充的solidpolygon()
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
int san[] = { 20,20,10,40,30,40 };
int san1[] = { 50,20,40,40,60,40 };
int san2[] = { 80,20,70,40,90,40 };
setfillcolor(RED);//设置颜色
fillpolygon((POINT*)san1, 3);//有边框有填充的三角形
solidpolygon((POINT*)san2, 3);//无边框有填充的三角形
polygon((POINT *) san, 3);//无填充的三角形
_getch();
closegraph();//关闭窗口
return 0;
}
参数两个,坐标和顶点个数
另一种坐标表示:
POINT pts[] = { {50, 200}, {200, 200}, {200, 50} };
polygon(pts, 3);
见代码:
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
int san[] = { 80,5,10,100,100,100 };
int san1[] = { 80,30,70,40,60,80,40,90 };
setfillcolor(RED);//设置颜色
setlinecolor(GREEN);//边框的颜色是绿色
fillpolygon((POINT*)san, 3);//有边框有填充的三角形
clearpolygon((POINT*)san1, 4);//清空不规则四边形
_getch();
closegraph();//关闭窗口
return 0;
}
无填充圆角矩形roundrect()
有边框有填充圆角矩形fillroundrect()
无边框有填充圆角矩形solidroundrect()
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
setfillcolor(RED);
roundrect(40, 40, 140, 100, 60, 60);//无边框无填充矩形
fillroundrect(40, 120, 140, 180, 60, 60);//有边框有填充矩形
solidroundrect(40, 200, 140, 260, 60, 60);//无边框有填充
_getch();
closegraph();//关闭窗口
return 0;
}
六个参数,前四个坐标----后两个为构成圆角矩形的圆角的椭圆的宽度和高度
上代码:
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
setlinecolor(GREEN);//边框的颜色是绿色
setfillcolor(RED);
fillroundrect(40, 40, 100, 120, 60, 60);//有边框有填充矩形
clearroundrect(60, 50, 80, 80, 20, 20);//清除圆角矩形区域
_getch();
closegraph();//关闭窗口
return 0;
}
线line() 点putpixel() 多线ployline()
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);//设置背景为白色
cleardevice();//用背景色清空屏幕
int xian[] = { 50,50,70,60,150,60,40,90 };
setlinecolor(BLACK);
line(20, 20, 100, 200);//画直线起终点坐标
putpixel(130, 40, RED);//画点
polyline((POINT*)xian, 4);//画多条线
_getch();
closegraph();//关闭窗口
return 0;
}
画多条线的方法和画多边形的差不多。。。嗯
设置字体颜色settextcolor()使用方法同上
#include
#include
int main()
{
initgraph(640, 480);
char str[] = "你好";
outtextxy(30, 50, str);
outtextxy(50, 10, "你好");
outtextxy(80, 80, "4");
_getch();
closegraph();//关闭窗口
return 0;
}
改成多字节字符集就行了(右击项目名>属性>字符集)
文字的居中输出:
要获取字符串的实际占用像素高度和宽度
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);
cleardevice();
setlinecolor(BLACK);
rectangle(50, 50, 200, 150);//画一个矩形文字居中输出
char txt[] = "你好";
int tw = textwidth(txt);//获取字符串宽度
int th = textheight(txt);//获取字符串高度
settextcolor(BLACK);
outtextxy(50 + (150 - tw) / 2, 50 + (100 - th) / 2, txt);//计算出居中位置
_getch();
closegraph();//关闭窗口
return 0;
}
最简单的就是三个参数的使用:高度,字符的平均宽度(为0的话则比例自适应),字体名称
#include
#include
int main()
{
initgraph(640, 480);
settextstyle(106,0 ,"楷体");
outtextxy(20, 20,"你好");
_getch();
closegraph();//关闭窗口
return 0;
}
此函数的其他用法详见使用手册
有五个参数(保存图像的IMAGE指针,获取图像区域的左上角坐标,获取图像区域的宽度和高度)
当前设备上绘制指定图像putimage()
绘制位置坐标,和IMAGE指针及相关参数
#include
#include
int main()
{
initgraph(640, 480);
setbkcolor(WHITE);
cleardevice();
setlinecolor(BLACK);
circle(30, 30, 20);
IMAGE img;
getimage(&img, 0, 0, 60, 60);
putimage(100, 100, &img);
_getch();
closegraph();//关闭窗口
return 0;
}
用于从文件中读取图像loadimage()
位置可以是相对路径也可以是绝对路径
#include
#include
int main()
{
initgraph(640, 480);
IMAGE img;//保存图像的 IMAGE 对象指针
//loadimage(NULL, "C:\\Users\\Desktop\\图片\\图\\1.jpg",640,480);//NULL在窗口输出 和窗口一样大
loadimage(&img, "C:\\Users\\Desktop\\图片\\图\\1.jpg");//&img
putimage(10, 10, &img);//在指定位置输出
_getch();
closegraph();//关闭窗口
return 0;
}
在输出图片时,还可以位运算操作
putimage(10, 10, &img);比如把彩色箭头留下,需要他图片的掩码图,利用位运算 | SRCPAINT,& SRCAND
putimage(10, 10, &img,SRCPAINT)
putimage(10, 10, &img,SRCAND)
图片大小保持一致
使窗口适应图片大小:
IMAGE是一个图形对象
img.getwidth();
返回 IMAGE 对象的宽度
img.getheight();
返回 IMAGE 对象的高度
#include
#include
int main()
{
IMAGE img;
loadimage(&img, "C:\\Users\\Desktop\\图片\\图\\1.jpg");//&img
int pt = img.getwidth();//求图片的宽度
int ph = img.getheight();//求图片高度
initgraph(pt, ph);//设置窗口大小
putimage(0,0, &img);//在指定位置输出
_getch();
closegraph();//关闭窗口
return 0;
}
注意路径
#include
#include
int main()
{
initgraph(640, 480);
circle(40, 40, 20);
saveimage("C:\\Users\\Desktop\\图片\\图\\2.jpg");//保存绘图内容
_getch();
closegraph();//关闭窗口
return 0;
}
ExMessage这个结构体用于保存消息
定义一个变量m
m.x,m.y鼠标当前坐标
m.message m的消息
m.vkcode m的按键的虚拟键码
getmssage()用于获取一个消息
#include
#include
int main()
{
initgraph(300, 300);
ExMessage m;//定义消息变量
setfillcolor(RED);
while (true)
{
m = getmessage(EM_MOUSE | EM_KEY);//获取一个鼠标或者按键消息
switch (m.message)
{
case WM_MOUSEMOVE://鼠标移动时画一个绿色的点
putpixel(m.x, m.y, GREEN);
break;
case WM_LBUTTONDOWN://鼠标左键点击画一个小矩形
fillrectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);
break;
case WM_RBUTTONDOWN://鼠标右键点击一个大矩形
fillrectangle(m.x - 20, m.y - 20, m.x + 20, m.y + 20);
break;
case WM_KEYDOWN://按下esc键退出
if (m.vkcode == VK_ESCAPE);
return 0;
}
}
_getch();
closegraph();
return 0;
}
输出随机颜色背景
#include
#include
#include
int main()
{
initgraph(640, 480);
srand((unsigned)time(NULL)); //设置随机种子
while (true)
{
setbkcolor(RGB(rand() % 256, rand() % 256, rand() % 256));//设置背景随机颜色
cleardevice();
Sleep(500);//休眠500毫秒
}
_getch();
closegraph();
return 0;
}
设置文字随机颜色
#include
#include
#include
int main()
{
initgraph(640, 480);
srand((unsigned)time(NULL)); //设置随机种子
while (!_kbhit())//当没有按键按下时
{
settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));//设置文字随机颜色
outtextxy(30, 100, "你好");
Sleep(500);//休眠500毫秒
}
_getch();
closegraph();
return 0;
}
设置随机数方法
srand((unsigned)time(NULL));
rand();
当rand()%一个数字时—随机数取值为0~这个数字-1
播放音乐
#include
#include
#include //包含多媒体设备接口头文件
#pragma comment(lib,"winmm.lib")//加载静态库
int main()
{
initgraph(640, 480);
setbkcolor(YELLOW);
cleardevice();
//alias 名字就是给文件起了一个别名 方便用
mciSendString("open D:\\编程\\音频\\bgm.mp3 alias BGM ",0,0,0);
mciSendString("play BGM repeat", 0, 0, 0);//repeat 重复播放
Sleep(10000);
mciSendString("close BGM", 0, 0, 0); //关闭音乐
_getch();
closegraph();
return 0;
}
文件可以相对路径和绝对路径
alias 取别名下面操作方便
小球移动
#include
#include
int main()
{
int x = 20, y = 20;//小球初始化坐标
initgraph(640, 480);
setbkcolor(WHITE);
cleardevice();
setfillcolor(RED);//小球颜色
while (true)
{
BeginBatchDraw();
fillcircle(x, y, 20);
EndBatchDraw();
if (GetAsyncKeyState(0x57))
{
y -= 5;
Sleep(1);
}
if (GetAsyncKeyState(0x53))
{
y += 5; Sleep(1);
}
if (GetAsyncKeyState(0x41))
{
x -= 5; Sleep(1);
}
if (GetAsyncKeyState(0x44))
{
x += 5; Sleep(1);
}
cleardevice();
}
_getch();
closegraph();
return 0;
}
只是实现了最基本的移动,GetAsyncKeyState()函数参数是虚拟键码,加上if语句可以判断是否有键盘操作,图形的参数是变量可实现运动的效果
MessageBox()弹出模式对话框
修改窗口名称
// 获得窗口句柄
HWND hWnd = GetHWnd();
// 使用 Windows API 修改窗口名称
SetWindowText(hWnd, "Hello!");
终于写完了,只是说明了一些简单函数的使用,想着写的细一些当个笔记用一用,网上也有很多用这个图形库写游戏的例子大家可以借鉴一下,如有错误请及时指出,欢迎交流!
虚拟键码
EasyX的手册