ACLLib是一个纯教学用途的纯C语言图形库,它并非任何产业界在使用的图形库,也不会有机会发展成为流行的图形库。它只是我们为了C语言学习的目的用的非常简单的图形库。它基于MS Windows的Win32API,所以在所有的Windows版本上都能使用。但是也因此它无法做成跨平台的库在其他操作系统上使用。
ACLLib在github上开源,网址是:https://github.com/wengkai/ACLLib
ACLLib是一个基于Win32API的函数库,提供了相对较为简单的方式来做Windows程序。
Windows API
- 从第一个32位的Windows开始就出现了,就叫做Win32API
- 它是一个纯C的函数库,就和C标准库一样,使你可以写Windows应用程序
- 过去很多Windows程序是使用这个API做出来的
main()
- main()成为C语言的入口函数其实和C语言本身无关,你的代码是被一小段叫做启动代码的程序所调用的,它需要一个叫做main的地方
- 操作系统把你的可执行程序装载到内存里,启动运行,然后调用你的main函数
- Win32API启动代码寻找的入口函数就是WinMain()而不是main()
CodeBlocks使用ACLLib图形库配置方法:
- 去https://github.com/wengkai/ACLLib下载src目录下的两个主要文件acllib.c和acllib.h
- 打开CodeBlocks,File->New->Project,创建一个新的项目,选择空项目即可
- 在项目的目录下新建一个main.c文件,并将acllib.c和acllib.h复制到该项目目录下,通过CodeBlocks的Project->Add file将这两个文件都添加到项目里来
- 通过CodeBlocks的Setting->Compiler,选择Linker settings,在CodeBlocks安装目录下的MinGW文件夹中的lib文件夹中找到下列8个文件add进去,点击OK即可。
- 然后打开main.c,即可开始写我们的代码啦~
我们ACLLib的程序的基本框架如下:(main.c)
#include "acllib.h"
int Setup(){
initWindow("test",DEFAULT,DEFAULT,width,width);
return 0;
}
我们的入口函数是大写开头的Setup(),在里面可以使用initWindow()去初始化一个窗口。
void initWindow(const char title[] , int left , int top , int width , int height);
参数含义依次为:窗口的标题,窗口的左边起始坐标,上面起始坐标,窗口宽度,窗口高度。
在窗口里面画图的代码要放在beninPaint()和endPaint()之间,代表画图的开始和画图的结束,任何绘图函数的调用必须在这一对函数调用之间才会生效。
在Windows中,坐标是以像素点的数字来定义的。对于你创建出来的窗口,左上角是(0,0),x轴自左向右增长,而y轴自上向下增长。
在终端窗口中,如果需要使用scanf()和printf()进行输入输出,则首先要使用initConsole()初始化,并且要记得加上stdio.h这个头文件,然后就可以在那个终端窗口使用scanf()和printf()了。
点
- void putPixel(int x,int y,ACL_Color color);//参数列表依次为x坐标,y坐标,颜色
- ACL_Color getPixel(int x, int y);
颜色
- RGB(r,g,b)
- 红色->RGB(255,0,0)
- 图形库预先定义了一些颜色可以直接使用,如BLACK,RED,GREEN,BLUE,CYAN,YELLOW,WHITE,MAGENTA
线
- void moveTo(int x, int y);//移动当前坐标到(x,y)
- void moveRel(int dx , int dy);//将当前位置移动dx和dy的相对距离
- void line(int x0,int y0,int x1,int y1);//画一条从(x0,y0)到(x1,y1)的直线
- void lineTo(int x,int y);//从当前点画线到(x,y)
- void lineRel(int dx,int dy);//从当前位置点到与当前点相对距离为dx和dy的点画一直线
- void arc(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nXStartArc,int nYStartArc,int nXEndArc,int nYEndArc);//画一条圆弧,参数列表依次为完整圆弧外接矩形的左坐标,顶部坐标,右坐标,底部坐标,圆弧开始的x坐标,y坐标,结束的x坐标,y坐标
画笔
- void setPenColor(ACL_Color color);//给画笔设置颜色
- void setPenWidth(int width);//设置画笔的宽度,单位为像素点
- void setPenStyle(ACL_Pen_Style style);//设置画笔的风格
- PEN_STYLE_SOLID//实线———-
- PEN_STYLE_DASH//虚线 – – – – –
- PEN_STYLE_DOT//点线 ··········
- PEN_STYLE_DASHDOT//虚线加点线-·-·-·-·-·-·
- PEN_STYLE_DASHDOTDOT//虚线加两个点的线-··-··-··-··
- PEN_STYLE_NULL//画一条看不见的线
面
- void chrod(int nLeftRect , int nTopRect , int nRightRect , int nBottomRect, int nXRadia1l,int nYRadial1,int nXRadial2,int nYRadial2);//画扇形
- void ellipse(int nLeftRect , int nTopRect,int nRightRect,int nBottomRect);//画椭圆
- void pie(int nLeftRect , int nTopRect , int nRightRect , int nBottomRect, int nXRadia1l,int nYRadial1,int nXRadial2,int nYRadial2);//画饼
- void rectangle(int nLeftRect , int nTopRect,int nRightRect, int nBottomRect);//画矩形
- void roundrect(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidth,int nHeight);//画圆角矩形
刷子
- 画笔负责线及面的边缘,刷子负责面的内部
- void setBrushColor(ACL_Color color);//设置刷子的颜色
- void setBrushStyle(ACL_Brush_Style style);//设置刷子的风格
- BRUSH_STYLE_SOLID
- BRUSH_STYLE_HORIZONTAL
- BRUSH_STYLE_VECRTICAL
- BRUSH_STYLE_FDIAGONAL
- BRUSH_STYLE_BDIAGONAL
- BRUSH_STYLE_CROSS
- BRUSH_STYLE_DIAGCROSS
文字
- void setTextColor(ACL_Color color);//设置文字的颜色
- void setTextBkColor(ACL_Color color);//设置文字的背景颜色
- void setTextSize(int size);//设置文字的字体大小
- void setTextFont(char *pFontName);//设置文字的字体风格
- void paintText(int x,y,const char *pStr);//以坐标点(x,y)为左上角写文字,文字内容为字符串pStr
练手画了一个Microsoft的Logo。
#include "acllib.h"
int Setup(){
initConsole();
int width = 400;
initWindow("Microsoft",DEFAULT,DEFAULT,width,width);
beginPaint();
setPenColor(RGB(246,83,20));
setBrushColor(RGB(246,83,20));
rectangle(0,0,200,200);//左上角
setPenColor(RGB(124,187,0));
setBrushColor(RGB(124,187,0));
rectangle(200,0,400,200);//右上角
setPenColor(RGB(0,161,241));
setBrushColor(RGB(0,161,241));
rectangle(0,200,200,400);//左下角
setPenColor(RGB(255,187,0));
setBrushColor(RGB(255,187,0));
rectangle(200,200,400,400);//右下角
endPaint();
return 0;
}