EasyX
一、基础知识
使用时包含头文件 <graphics.h>
即可。注意 easyX
只能识别后缀为 .cpp
的源文件, .c
不行。
颜色:RGB(红绿蓝)三原色。0~255。
程序里表示 RGB(红色部分,绿色部分,蓝色部分)
坐标系原点在左上角,右是X轴正方向,下是Y轴正方向
设备:就是绘图界面。
在EasyX中,设备分为两种:一种是默认的绘图窗口,另一种是IMAGE对象。通过 SetWorkingImage()
函数可以设置当前用于绘图的设备。
二、窗口函数
initgraph(int width,int height,int flag=NULL); //初始化绘图窗口(创建窗口)
// width 指定窗口宽度;
// height 指定窗口高度;
// flag 窗口样式,默认为NULL。还有其他三种情况:showconsole显示控制台 noclose不能关闭 nominimize只能关闭,不能隐藏和放大
//使三种情况都满足: initgraph(640,480,SHOWCONSOLE | NOCLOSE | NOMINIMIZE) ,就能出现关不掉的窗口
closegraph(); //关闭绘图窗口
cleardevice(); //清空绘图设备
有开始就有关闭,缺一不可。
示例程序:
#include<graphics.h>
#include<stdio.h>
int main()
{
initgraph(640,480);
getchar(); //使窗口停留
closegraph();
return 0;
}
左上角不是路径而是文件名。
三、绘图函数
1.从填充样式
绘图函数根据填充样式可以分类为:无填充,有边框填充,无边框三种。
以画圆为例,分别对应:circle()
; fillcircle()
; solidcircle()
;
(无填充没有前缀,有边框加前缀 fill-
,无边框加前缀 solid-
)
2.从形状
根据形状来分,常用的可以分为八种:
circle(int x,int y, int radius) //圆:原点的x,y坐标,半径
ellipse //椭圆
pie //扇形
polygon //多边形
rectangle(int x1,int y1,int x2,int y2) //矩形:左上角和右下角的坐标
roundrect //圆角矩形
line //线
putpixel //点
3.颜色
setfillcolor(颜色); //设置填充颜色
setlinecolor(颜色); //设置线条颜色
setlinestyle(样式,宽度); //设置线条样式
//更改背景颜色需要两步
setbkcolor(颜色); //step1:设置背景颜色
cleardevice(); //step2:清除黑色
示例:
四、文字绘制函数
outtextxy(int x,int y,LPCTSTR str); //在指定位置输入字符串:x,y,字符串内容
settextcolor(颜色);
settextstyle(int height,int width,"字体样式"); //宽度写0==自适应高度
setbkmode(TRANSPARENT); //设置背景框为透明
int width = textwidth("文字"); //计算文字所占的像素宽度
int height = textheight("文字"); //计算文字所占的像素高度
居中文字的示例
fillrectangle(200, 50, 500, 100); //绘制宽(500-200),高(100-50)的矩形
settextcolor(RGB(173, 0, 13));
char arr[] = "我是居中显示";
int width = 300/2 - textwidth(arr)/2; //计算arr[]里文字所占的像素宽度
int height = 50/2 - textheight(arr)/2; //计算...的像素高度
outtextxy(200+width, 50+height, arr);
注意,此处可能出现报错:
这是因为字符串的实际存储有多种编码格式,如果默认的编码格式和实际执行的平台不相符就会发生错误。
解决方法:1.在字符串前面加上大写的L
2.用TEXT()把字符串包起来
3.只需右键项目>属性>配置属性>高级,把高级属性中的字符集改为使用多字节字符集
五、图像处理函数
IMAGE:图像变量,和 int ,char ,一样的变量类型
eg: IMAGE img;
loadimage(IMAGE *pDstimg, LPCTSTR pimgFile,int nWidth=0, int nHeight=0, bool bResize=false);
//pDstimag 保存图像的 IMAGE对象的指针 &img
//pimgFile 图片所在的位置
//nWidth 图片的拉伸宽度
//nHeight 图片的拉伸高度
//bResize=false 是否调整 IMAGE 的大小以适应图片
putimage(int dstX,int dstY,IMAGE *pSrcimg,DWORD dwRop=SRCCOPY);
//dstX 绘制位置的x坐标
//dstY 绘制位置的y坐标
//pSrcimg 要绘制的 IMAGE对象的指针 &img
//dwRop=SRCCOPY 三元光栅操作码
示例
IMAGE img; //定义一个(变量)对象
loadimage(&img,"./backgroud.jpg",320,480); //加载图片+相对路径。(宽,高)这俩可以不要。
//优先使用.jpg。 因为.png不支持背景透明
//如果路径中有空格,则需要 双引号+反斜杠转义
// eg: \"Hello world\"
putimage(0, 0, &img);
六、鼠标操作
1.MOUSEMSG 类型
eg: MOUSEMSG msg;
用 MoustHit()
来判断是否有鼠标消息,是布尔类型。有鼠标返回“真”,无消息返回“假”。(左右键,中键,滚轮,移动,双击)
有鼠标消息后获取鼠标消息:msg = GetMouseMsg();
//鼠标消息的主要成员:
uMsg //当前鼠标消息:WM_LBUTTONDOWN鼠标左键消息
//WM_RBUTTONDOWN鼠标右键消息
x //当前鼠标的x,y坐标
y
示例:
while (1) { //不断处理事务
if (MouseHit())
{
cleardevice();
MOUSEMSG msg = GetMouseMsg();
//消息分发
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
outtextxy(400, 400, "鼠标左键按下");
printf("鼠标坐标(%d,%d)\n", msg.x, msg.y);
break;
case WM_RBUTTONDOWN:
outtextxy(300, 300, "鼠标右键按下");
printf("鼠标坐标(%d,%d)\n", msg.x, msg.y);
break;
}
}
}
2.新版函数
头文件:#include
示例:
#include<stdio.h>
#include<easyx.h>
void button(int x, int y, int w, int h)
{
setbkmode(TRANSPARENT);
setfillcolor(BROWN);
fillroundrect(x, y, x + w, y + h, 10, 10);
settextstyle(30, 0, "黑体");
char text[] = "button";
int tx = x + (w - textwidth(text))/2;
int ty = y + (h - textheight(text)) / 2;
outtextxy(tx, ty, text);
}
int main()
{
initgraph(640, 480, EX_SHOWCONSOLE);
button(50, 50, 150, 50);
while (true)
{
ExMessage msg;
if (peekmessage(&msg, EX_MOUSE))
{
switch (msg.message)
{
case WM_LBUTTONDOWN:
if (msg.x >= 50 && msg.x <= 50 + 150 && msg.y >= 50 && msg.y <= 50 + 50)
{
printf("我是按钮我被点击啦\n");
}
}
}
}
getchar();
return 0;
}
七、键盘消息函数
getch(); //需要头文件 conio.h
GetAsyncKeyState(键值); //需要头文件 windows.h ,但是 EasyX 本来就包含了 windows文件,所以无需再包含
getch(); 需要使用返回值来判断
如果是字母,则直接与字母比较,如:'A'
如果是非 ASCII 表的字符,则用虚拟键值,如:上==72,下==80,左==75,右==77
GetAsyncKeyState(键值); 需要传入一个键值,如果按下,则返回真
八、解决闪屏现象
在设备上不断进行绘图操作时,会产生闪屏现象。用两个函数就能处理:
BeginBatchDraw(); //开始批量绘图
//中间是绘图代码
EndBatchDraw(); //结束批量绘图
九、弹出对话框
MessageBox(NULL,"我是文字文字","我是标题",MB_OKCANCEL);
//NULL可以改成窗口句柄 //按钮类型
//会返回值,可以用来比较,eg:
int point = MessageBox(NULL,"我是文字文字","我是标题",MB_OKCANCEL);
if(point==IDOK){
printf("你点击了OK")
}else if(point==IDCANCEL){
printf("你点击了取消")
}
十、修改窗口标题
HWND hnd = GetHWnd(); //获取窗口句柄
SetWindowText(hnd,"新标题"); //设置窗口标题