目录
EGE图形库简介
EGE的全称是Easy Graphics Engine,即简单图形引擎。其设计目标是为Windows平台下的C语言学习者提供一个类似于早期DOS(Disk Operating System,磁盘操作系统,微软公司在Windows之前的一个命令行字符界面的操作系统)环境下类似TC(Turbo C,DOS环境下一个好用简单易学的C语言学习开发环境,现在很少用)中的BGI(Borland公司的图形法接口)。
下载地址
(官网) ege20.08_all(推荐, 支持vs2010-vs2019以及devcpp,codeblocks等)
(百度网盘)https://pan.baidu.com/s/1qWxAgeK
其他下载 内置EGE最新版本DEV-C++ https://royqh.net/devcpp/download/
特别说明
代码主要源于《C语言从入门到实践》,其中作业一小部分的修改。
环形广告跑马灯
源代码:
#include <graphics.h>
#include <math.h>
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define DELAYTIME 50 //广告移动延时
#pragma GCC diagnostic ignored "-Wunused"
#pragma GCC diagnostic ignored "-Wunused-parameter"//禁用未适用的参数警告
//输出要显示的广告信息到msg数组中
void getinput(unsigned char msg[])
{
char str[100];
int isinputok=0;//是否输入全是汉字字符(英文字符必须为全角方式输入)
/*利用EGE库提供的输入框输入待显示的汉字或全角英文字符
进行输入容错处理,输入的字符串如果不满足条件,
则继续输入,直到输入正确为止*/
while(!isinputok){
inputbox_getline("跑马灯广告发布系统","请输入待发布的广告信息\n必须全为汉字或全角英文字,输入完成请回车!",str,sizeof(str)/sizeof(*str));
/*一个汉字占2个字节,每个字节的最高二进制位都是1
看成无符号正数,都大于等于0x80*/
isinputok=1;
for(int i=0;i<(int)strlen(str);i++)
{
if((unsigned char)str[i]<0x80)
{
//检测输入串是否全为汉字或全角英文字符
//若有一个不是,则输入失败
isinputok=0;
break;
}
}
}
strcpy((char*)msg,str);//将输入成功的待显示字符串复制到数组msg中
}
//读取广告msg字符串中所有字符点阵信息到mat数组中
void getmat(unsigned char mat[],unsigned char msg[])
{
FILE *HZK;
int i,j,k;
unsigned char *p=mat;
if((HZK=fopen("hzk16.txt","rb"))==NULL)
{
outtextxy(10,10,"汉字库文件读取失败!");
exit(0);
}
for(k=0;k<(int)strlen((char*)msg)/2;k++)
{
i=msg[k*2]-0xa0;
j=msg[k*2+1]-0xa0;//获得区码与位码
fseek(HZK,(94*(i-1)+(j-1))*32,SEEK_SET);
fread(p+k*32,32,1,HZK);
}
fclose(HZK);
}
//显示广告信息msg,其字符点阵在数组在mat中
void showonechar(int x,int y,int gap,unsigned char mat[],unsigned char msg[],color_t color)
{
int i,j,k,t;
for(i=0;i<16;i++)//控制输出16行
{
t=x;
for(j=0;j<2;j++)//输出一个字符的2个字节
{
for(k=0;k<8;k++)//输出一个字节的8个像素点
{
if(mat[i*2+j]&(0x80>>k))
{
putpixel(x,y,color);//输出黄色的像素点
}
else{
putpixel(x,y,RGB(0,0,0));//输出背景黑色的像素点
}
x=x+gap;//相邻两个像素点之间的距离
}
}
x=t;
y=y+gap;//像素行间距
}
}
//显示广告信息
void showad(unsigned char mat[],unsigned char msg[])
{
int x,y;
int len=strlen((char *)msg)/2;
randomize();//初始化随机种子
color_t bkcolor=RGB(0,0,0);//背景黑色
int gap=5;//像素建间距
int r=300;//初始圆的半径
int dir=1;//半径放大方向,1减小,-1放大
int size;//一个汉字显示时占的像素宽或高
while(1){
for(int i=0;i<len;i++)
{
//(x,y)为一个汉字显示的像素矩形块的中心点的坐标
x=(int)(640+r*sin(2*M_PI/len*i));
y=(int)(400-r*cos(2*M_PI/len*i));
//一个汉字显示的像素块的大小
//一个汉字16*16点阵,加上像素点的间距
//16个点有15个间距,间距大小为gap
size=15*gap+16;
//随机生成一个和背景颜色不同的颜色
color_t color=RGB(random(255),random(255),random(255));
while(color==bkcolor){
color=RGB(random(255),random(255),random(255));
}
//显示一个字符
showonechar(x-size/2,y-size/2,gap,&mat[i*32],&msg[i*2],color);
}
delay(100);
r=r-20*dir;//更改半径大小
if(r<=30)//达到最小,开始更改为增大的方向
{
r=r+20*dir;//恢复上次的r,保证r不小于30
dir=-1;
delay(100);//最小时多延迟1秒清屏
cleardevice();
}
if(r>=230){//半径大于等于230时更改方向
// r=r-20*dir;
dir=1;
delay(100);
cleardevice();
}
gap=r/70+1;//适当更改点阵中像素的间距
}
}
int main(void)
{
unsigned char mat[672];//最多20个汉字,每个汉字32字节,多一个32作为余量
unsigned char msg[41];//最多20个汉字,如有英文字符,则用全角方式输入
initgraph(1280,800);
cleardevice();
setcaption("跑马灯广告发布系统");
getinput(msg);//获取待显示的字符串
getmat(mat,msg);//获取字符串中所有字符的点阵信息保存到mat中
showad(mat,msg);//显示环形广告
closegraph();
return 0;
}
点阵文件:HZK16.txt,有需求可以私聊我下载。
演示视频:
制作中......