环境 VS2022 + Easyx2022 Win10 64
Easyx
是针对 C++
的图形库,可以帮助C/C++
初学者快速上手图形和游戏编程,说人话就是摆脱黑框,增加图案之类的。下面展示下几张 效果图前提首先得有vs2022 (任意版本都行 再去下载easyx库)
下载链接 下载之后按时 VS对应版本 ,如果·1不是vs2022,就下载对于的版本
先通过一个小程序初始一下easyx ,下面这个程序的功能是画一个⚪
#include //easyx库
#include //system 的头文件
int main() {
//初始化图像界面(黑窗口) 640(宽) x 480(高)
initgraph(640,480);
//构建需要的图形 画一个以(x=320,y=240)为圆心的一个圆,半径为200的像素
circle(320, 240, 200);
system("pause");//暂停 一下
//关闭图形界面
closegraph();
return 0;
}
坐标默认原点在窗口的左上角,X轴向右为正,Y 轴向下为正,度量单位是像素点
用RGB宏合成颜色,实际上合成出来的颜色是一个十六进制的的整数。
RGB(R红色,G绿色,B蓝色)
每个颜色的值都是从0~255 (数值越高对应颜色越浅)
后面颜色变量需要使用到
#include
//width 指定窗口的宽度 height 指定窗口的高度
initgraph(int width,int heigh,int flag=NULL);//用于初始化绘图窗口(创建窗口)
若要同时实现,则需要使用 | 隔开
initgraph(x,y,NOCLOSE | NOMINIMIZE);
getch(); <conio.h>
getchar();//接受图形
system("pause");//也可以用这种方式接受图片
如果没有则会出现以下情况,直接弹出
closegraph();//关闭图形 不含参数 一般放最后
cleardevice()
结合刚开始那个程序
情况一:
cleardevice();//清空内容,但是背景不会修改(不含参)
circle(320, 240, 200); //画圆
cleardevice(); //清空内容
情况二:
circle(320, 240, 200);
setbkcolor(WHITE);//设置白色的背景
cleardevice();//清空内容 但是不清空背景
set开头的函数通常放于最前面
有三种方式:RGB、大写英文单词、六个十六进制颜色链接.
setcolor(RGB(0,0,0));
setcolor(BLACK);
setcolor(0x000000);
设置前景颜色 (字体颜色
setlinecolor
和线条颜色settextcolor
)。
void setcolor(颜色变量);
void setlinecolor(颜色变量);
void settextcolor(颜色变量);
void setbkcolor(颜色变量);
void setfillcolor(颜色变量);
void setbkmode(int mode);
mode参数:
OPAQUE 不透明 默认用当前背景填充。
TRANSPARENT 背景是透明的, 用于背景上叠加字体
俩种方式
方式1:
void setlinestyle(
const LINESTYLE* pstyle//指向画线样式 LINESTYLE 的指针。
);
方式2:
void setlinestyle(
int style,//直线样式、端点样式、连接样式
int thickness = 1,
const DWORD *puserstyle = NULL,
DWORD userstylecount = 0
);
//设置线条样式 setlinestyle(样式,厚度);
参数详细链接
void circle( int x, int y, int radius);
//(x,y) 坐标 radius:半径
使用当前填充样式绘制
void line(int x1,int y1,int x2,int y2);
//(x1,y1):起始点 (x2,y2) :终止点
line(320, 240, 200,123); //↓
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main() {
initgraph(640, 480);
for(int y = 0; y <= 480; y += 48) {
line(0, y, 640, y);
}
getchar();//接受图形 #include
closegraph();//关闭图形
return 0;
}
void putpixel (int x, int y, COLORREF color) //第三个参数是颜色变量
//putpixel( 34, 232, RED);
settextcolor(颜色);//设置当前文字颜色
settextstyle(高度,宽度,字体);//设置字体样式 eg. "黑体"
//如果高度,宽度为0,则比例自适应。
textheight(字符串);//获取字符串实际占用的像素高度
textwidth(字符串);//获取字符串实际占用的像素宽度
outtextxy(int x,int y,字符串);//在指定位置输出字符串
下面是文字居中的程序
VS2022报错看这篇文章
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
int main()
{
initgraph(1040, 600, SHOWCONSOLE);//设置图形边框
setbkcolor(BLUE);//设置背景颜色
cleardevice();//覆盖之前背景颜色
setfillcolor(RED);//填充颜色
fillrectangle(400, 200, 600, 300);//设置一个有边框矩形(边框默认白色 且居中 )
settextstyle(20, 0, _T("楷体"));//设置字体样式
settextcolor(YELLOW);//设置字体颜色
setbkmode(TRANSPARENT);//设置字体背景颜色(透明)
char arr[] = "Easyx";//定义一个字符串
int height = (100 - textheight(arr)) / 2;//计算空隙高度
int width = (200 - textwidth(arr)) / 2;//计算空隙宽度
outtextxy(400 + width, 200 + height, arr);//加上原先高宽,并输出字符串
getchar();//接受图形
closegraph();//关闭图形
return 0;
}
还有IMAGE类型 可以看官网 下面只是简单的调用背景
// 从图片文件获取图像(bmp/gif/jpg/png/tif/emf/wmf/ico)
void loadimage(
IMAGE* pDstImg, // 保存图像的 IMAGE 对象指针
LPCTSTR pImgFile, // 图片文件名
int nWidth = 0, // 图片的拉伸宽度
int nHeight = 0, // 图片的拉伸高度
bool bResize = false // 是否调整 IMAGE 的大小以适应图片 通常不用
);
JPG图像不支持透明背景
如果创建 IMAGE 对象的时候没有指定宽高,可以通过 Resize 函数设置。对于没有设置宽高的 IMAGE 对象执行 loadimage 会将其宽高设置为和读取的图片一样的尺寸。直接填写图片路径
#include
int main() {
// 绘图窗口初始化
initgraph(700, 600);
// 读取图片至绘图窗口
loadimage(NULL, _T("C:\\Users\\27285\\Pictures\\Saved Pictures\\zz.jpg"));//路径 vs2022需要+ _T 不然报错
// loadimage(NULL,_T("C:\\Users\\27285\\Pictures\\Saved Pictures\\zz.jpg"),500,400); //
getchar();
closegraph();
}
把图片放到源文件所在的文件夹中 直接使用
文件名.格式
#include
#include
int main() {
// 绘图窗口初始化
initgraph(700, 600);
// 读取图片至绘图窗口
loadimage(NULL, _T("zz.jpg"));
getchar();
closegraph();
}
// 鼠标消息
// 支持如下消息:
WM_MOUSEMOVE 鼠标移动
WM_MOUSEWHEEL 鼠标滚轮拨动
WM_LBUTTONDOWN 左键按下
WM_LBUTTONUP 左键弹起
WM_LBUTTONDBLCLK 左键双击
WM_MBUTTONDOWN 中键按下
WM_MBUTTONUP 中键弹起
WM_MBUTTONDBLCLK 中键双击
WM_RBUTTONDOWN 右键按下
WM_RBUTTONUP 右键弹起
WM_RBUTTONDBLCLK 右键双击
struct MOUSEMSG
{
UINT uMsg; 当前鼠标消息
bool mkCtrl; Ctrl 键是否按下
bool mkShift; Shift 键是否按下
bool mkLButton; 鼠标左键是否按下
bool mkMButton; 鼠标中键是否按下
bool mkRButton; 鼠标右键是否按下
short x; 当前鼠标 x 坐标
short y; 当前鼠标 y 坐标
short wheel; 鼠标滚轮滚动值 (120 的倍数)
};
bool MouseHit(); 检查是否存在鼠标消息
MOUSEMSG GetMouseMsg(); 获取一个鼠标消息。如果没有,就等待
void FlushMouseMsgBuffer(); 清空鼠标消息缓冲区
要点总结 : 需要 嵌套在while(true){ } 中
#include
#include
#include
int main() {
MOUSEMSG m;
// 初始化绘图窗口
initgraph(640, 480);
// 设置背景色为白色
setbkcolor(WHITE);
// 用背景色清空屏幕 (设置背景色)
cleardevice();
setfillcolor(RED);//框框颜色
solidrectangle(100, 100, 300, 150);//画一个填充矩形
settextstyle(50, 0, "微软雅黑");//设置字体
setbkmode(TRANSPARENT);//需要透明 不然会被字体覆盖
outtextxy(150, 100, "确定");
while (true) {
m = GetMouseMsg();
if (m.x >= 100 && m.x <= 300 && m.y >= 100 && m.y <= 150) {//设置范围
setlinecolor(BLACK);
rectangle(100, 100, 300, 150);//显示黑框 反馈作用
if (m.uMsg == WM_LBUTTONDOWN) { //如果按下鼠标左键实现相应功能.
closegraph();//关闭画面
printf("It is Real !!\n");//在小黑框打印
break;
}
}
else { //当鼠标不在目标位置就覆盖之前的黑色线框.
setlinecolor(WHITE);
rectangle(100, 100, 300, 150);
}
}
getchar();
closegraph();//关闭窗口
}
俩种方式:
①getch() == ch
头文件
不推荐使用
②GetAsyncKeyState 推荐
头文件
但是easyx
的头文件包含了
,
要点 :需要死循环进行 while(true) { ... }
如果想读入字母 则参数为('A~Z‘)
大写 , ↑↓←→如下
//小球移动 已经做边界处理
#include
#include
#include
int main() {
double x = 50, y = 50;//定义小球初始位置
initgraph(1040, 600, SHOWCONSOLE);//设置图形边框
while (true) {
setbkcolor(WHITE);//设置背景颜色
cleardevice();//
//int x = 50, y = 50;
double v = 0.1;//定义速度v int 速度太快
setfillcolor(BLUE);//设置小球颜色
fillcircle(x, y, 10);//设置小球大小位置
FlushBatchDraw();//结束批量绘制
//如果到边界了 就把对于坐标返回
if (y <= 0 || x <= 0 || x >= 1040 || y >= 600) {
if (x <= 0) {
x += 1;
}
else if (x >= 1040) {
x -= 1;
}
else if (y <= 0) {
y += 1;
}
else if (y >= 600) {
y -= 1;
}
continue;
}
else {
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;
}
注意头文件中 mmsystem.h
和 winmm.lib
需要写在 graphics.h
的下面
使用 mciSendString ()
来打开和播放音乐,后面三个参数暂时不用管,都写 0
还是建议把音乐文件放在与源代码相同目录的地方
可对音乐文件取别名 alias +别名
加载静态库:#pragma comment(lib,“winmm.lib”) (放在头文件里面)
mciSendString("play Mighty.mp3 repeat", 0, 0, 0);
如果加上repeat 就可以重复播放
#include
#include
#include
using namespace std;
#pragma comment(lib,"winmm.lib") //调用库函数
int main() {
for (int i = 100000000; ; i--) {
cin >> i;
if(i == 1)//如果输入1 就暂停
mciSendString("close Mighty.mp3", 0, 0, 0);
else//否则就播放
mciSendString("play Mighty.mp3", 0, 0, 0);
}
getchar();
closegraph();
}
头文件
链接
// 定义字符串缓冲区,并接收用户输入
wchar_t s[10];
InputBox(s, 10, L"请输入半径");
#include
#include
int main()
{
// 初始化绘图窗口
initgraph(640, 480);
// 定义字符串缓冲区,并接收用户输入
wchar_t s[10];
InputBox(s, 10, L"请输入半径");
// 将用户输入转换为数字
int r = _wtoi(s);
// 画圆
circle(320, 240, r);
// 按任意键退出
_getch();
closegraph();
return 0;
}
至于为什么返回6,自己可以写个程序判断下,防正vs2022,YES返回值就是6,NO返回值就是7,如果想实现多重,那就一直套娃就行了
#include
int main() {
int a;
a = MessageBox(0, "Are you OK?", "Question", MB_YESNO);
if (a == 6) { //Yes 返回值为 6
MessageBox(0, "You are OK.", "Caption", MB_OK);
}
if (a == 7) {
MessageBox(0, "You aren\'t' OK.", "Caption", MB_OK);
}
return 0;
}
多用,多实践,多搞项目~
文章大部分参考——easyx官方文档