ACLLib图形库初试

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图形库配置方法:

  1. 去https://github.com/wengkai/ACLLib下载src目录下的两个主要文件acllib.c和acllib.h
  2. 打开CodeBlocks,File->New->Project,创建一个新的项目,选择空项目即可
  3. 在项目的目录下新建一个main.c文件,并将acllib.c和acllib.h复制到该项目目录下,通过CodeBlocks的Project->Add file将这两个文件都添加到项目里来
  4. 通过CodeBlocks的Setting->Compiler,选择Linker settings,在CodeBlocks安装目录下的MinGW文件夹中的lib文件夹中找到下列8个文件add进去,点击OK即可。
  5. 然后打开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;
}

 

2 comments

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注