您现在的位置是:首页 > 数码 > 

EGE基础:文字篇

2025-07-26 09:18:38
EGE基础:文字篇 EGE专栏:EGE专栏 EGE基础:文字篇 目录 一、文字输出1. 文字输出简介1.1 坐标系1.2 文字样式1. 文字输出1.4 文字输出示例 2. 文字输出函数2.1 单行输出: xyprintf() 和 outtextxy()2.2 多行输出:outtextrect(), rectprintf()2. 带透明

EGE基础:文字篇

EGE专栏:EGE专栏

EGE基础:文字篇

目录
  • 一、文字输出
    • 1. 文字输出简介
      • 1.1 坐标系
      • 1.2 文字样式
      • 1. 文字输出
      • 1.4 文字输出示例
    • 2. 文字输出函数
      • 2.1 单行输出: xyprintf() 和 outtextxy()
      • 2.2 多行输出:outtextrect(), rectprintf()
      • 2. 带透明度文字输出(ege_drawtext)
      • 2.4 文字排版对齐问题
    • . 格式化字符串输出
  • 二、文字的设置
    • 1. 文字相关颜
      • 1.1 文字颜
      • 1.2 文字背景
    • 2. 文字字体和大小
      • 2.1 支持的字体
      • 2.2 字体显示测试
    • . 文字样式(加粗,斜体,下划线,删除线等)
    • 4. 文字对齐方式
    • 5. 获取要输出的字符串的尺寸
  • 三、文本文件内容显示
    • 1. 文本的编码设置
    • 2. 文件的打开
    • . 文件的读取

一、文字输出

1. 文字输出简介

  图形窗口中的文字并不像控制台那样只能固定输出在某一行中,可以在绘图区的任意位置进行输出。

1.1 坐标系

  窗口绘图区坐标系如下图所示: x x x 轴向右为正, y y y 轴向下为正。从左到右,从上到下,这和我们平时阅读文字的顺序是一致的。

  屏幕显像区域是由固定数量的像素点组成,左上角像素的坐标为 ( x , y ) (x, y) (x,y), 如果窗口的宽度 为 s c r e e n W i d t h \mathrm{screenWidth} screenWidth 个像素, 高度为 s c r e e n H e i g h t \mathrm{screenHeight} screenHeight 个像素,那么右上角像素点坐标为 ( s c r e e n W i d t h − 1 , 0 ) (\mathrm{screenWidth}-1, 0) (screenWidth−1,0) 。

  在图形窗口中输出文字需要给出文字的位置信息,这个位置信息一般是指文字输出区域的左上角坐标。至于文字的大小,一般会有函数进行统一设置,不需要在输出文字时指定每个字的大小,因为一行文字基本上是使用统一的样式,而不是样式各不相同。

1.2 文字样式

  文字输出前需要设置好文字样式,否则默认的字体、大小和颜可能不符合需求。
  EGE中的 setfont() 函数可以设置字体、宽度和高度,还可以将文字样式设置为斜体,粗体,旋转角度等。
  通常以如下方式使用,设置文字的高度和字体,宽度为0即让系统自动按照文字对应的宽度输出,如果设置固定宽度可能会让文字变形。常用字体有:宋体, 黑体, 楷体等。

setfont(height, 0, 字体名);

  setfont() 还有很多重载,可以设置更复杂的文字样式。

  详细可以参考 EGE库函数文档:setfont()。

  文字的颜则是通过setcolor() 进行设置,颜可以带透明度,但只有ege_drawtext() 支持输出带透明度的文字,其它的文字输出函数会忽略透明度。

setcolor(EGEARGB(0x80, 0x0, 0x0, 0x0));

  当然还有个文字背景,由 setfontbkcolor() 指定,不过一般我们都不会让文字有自己的背景,背景都是透明的,文字后面原来是什么图就显示什么。
  所以我们一般都会加上一个设置,让文字的背景为透明,即下面这句:

setbkmode(TRASPARET);			//设置文字背景为透明

  文字对齐方式可以使用 settextjustify()进行设置,两个参数分别是水平对齐方式和垂直对齐方式。下面示例为水平居中,垂直居中对齐。

settextjustify(CETER_TEXT, CETER_TEXT);
1. 文字输出

  设置好合适的文字样式后,就可以使用相关函数输出文字了。EGE最常用的文字输出函数为 xyprintf(),它具有和C标准库的printf() 类似的使用方式,可以将变量转为字符串进行输出,仅仅是需要多添加两个位置相关参数,用于指定文字输出位置的左上角坐标。

xyprintf(x, y, 格式化字符串, 参数1, 参数2, ...);		//图形窗口的输出

  如果只是想输出固定的文字,不带参数即可。

xyprintf(x, y, 要输出的文字);

  当然,输出固定文字有专用的 outtextxy() ,可以免去字符串解析。

outtextxy(x, y, 要输出的文字);

  上面两个函数不可以让文字输出时自动换行,所以有了 rectprint(),指定一个矩形区域,让文字即将超出区域时自动换行。

rectprintf(x, y, width, height, 格式字符串, 参数1, 参数2,...);
1.4 文字输出示例
#include <graphics.h>int main()
{initgraph(640, 480,0);			//初始化窗口setbkcolor(WHITE);				//设置窗口背景为白//文字的属性设置setcolor(BLACK);						//文字的颜setbkmode(TRASPARET);					//设置文字背景为透明	int height = 40;						//文字高度setfont(height, 0, 楷体);				//设置文字宽度和字体settextjustify(LEFT_TEXT, TOP_TEXT);	//水平左对齐,垂直顶部对齐//输出文字xyprintf(100, 100, 这里是输出的文字); 	getch();closegraph();return 0;
}

2. 文字输出函数

  除了最常用的xyprintf(), 还有一些其它的,下面都列出来。
  需要注意的是,这些函数末尾其实还有个 PIMAGE参数,指定输出到图像上,省略则是输出到窗口。

单行输出多行输出
固定文本outtextxy(), outtext()outtextrect()
格式化文本xyprintf()rectprintf()
2.1 单行输出: xyprintf() 和 outtextxy()

  单行输出有两个函数:xyprintf()outtextxy()
  单行输出,即指定了坐标后,只会在一行输出, 即使超出窗口范围了也不会换行,并且无法输出 \t, \n等特殊符号,如有需要,使用 多行输出函数

  在指定位置 ( x , y ) (x, y) (x,y)处输出文字,可以使用 outtext() ,不过这个只适合输出固定的文字,如果想将一些变量转换为字符串输出,那将应该使用 xyprintf()

outtextxy(x, y, 你想要输出的文字);

   xyprintf() 类似 printf() ,可以输出参数,也可以输出固定文字。

xyprintf(x, y, 格式字符串(%d, %f之类的, 参数1, 参数2, ...);

  还有个outtext()函数是在当前位置输出文字,``当前位置moveto(), moverel() 指定。

outtext(想要输出的文字);
2.2 多行输出:outtextrect(), rectprintf()

  多行输出有以下两个函数:outtextrect()rectprintf()
  指定一个输出区域,文字会在这个区域内输出,要超出边界时自动换行。并且可以使用 \n, \t 来控制文字的换行与缩进,可以很方便地用于像控制台的printf() 那样连续输出多行文字。如果仅仅用xyprintf() 输出多行文字的话,需要自己控制每一行的起始位置坐标。

在某个矩形区域内输出:

outtextrect(x, y, width, height, 想要输出的文字);
rectprintf(x, y, width, height, 格式字符串, 参数1, 参数2,...);
2. 带透明度文字输出(ege_drawtext)

  额外地,我们新增了一个 ege_drawtext 函数,可以使用ARGB颜,绘制出带透明度的文字,函数声明如下:

void EGEAPI ege_drawtext(LPCSTR  textstring, float x, float y, PIMAGE pimg = ULL);
void EGEAPI ege_drawtext(LPCWSTR textstring, float x, float y, PIMAGE pimg = ULL);

现在,设置颜为ARGB颜后,就可以直接使用了,如:

//设置透明度为0x80的蓝
setcolor(EGEACOLOR(0x80, BLUE));ege_drawtext(这里是要输出的文字, 20, 40);

  这个函数和其它函数的参数位置有点区别,位置参数是放后面。
  最后有个PIMAGE参数,是指定输出的目标图像,如果要输出到窗口,省略或者传入ULL即可。

2.4 文字排版对齐问题

  如果有让文字占固定的宽度的需求,可使用格式化字符串的 %[flag][]type 格式,如printf(“%10d, %10s\n”, 12, “string” ) 中的 %10d 和 %10s

注意事项:

  • 先使用 setfont() 设置好相应的字体,部分字体的文字所占宽度不同,难以对齐。部分字体空格所占的宽度更是难以计算。
  • 汉字、及汉字标点符号占两个字符宽度
  • 英文字母、英文标点符号和数字占一个字符宽度

printf 格式字符串相关参考

文字对齐示例

#include <graphics.h>int main()
{initgraph(700, 00, 0);setcolor(BLACK);setbkcolor(WHITE);setfont(16, 0, 宋体);xyprintf(0, 0, |%-12s|%-12s|%-12s|%-12s|%-12s,文字, 对齐,  的一个示例, 对齐, font align );xyprintf(0, 20,|%-12s|%-12s|%-12s|%-12s|%-12s|%-12s|%-12s,EGE文字对齐, 文字对齐, 12,   !%#@!$2)*&, 1222,一二三四五, 0);getch();closegraph();return 0;
}

. 格式化字符串输出

  EGE提供了两个可以格式化输出的文字输出函数:

xyprintf(x, y, 格式字符串(%d, %f之类的, 参数1, 参数2, ...);
rectprintf(x, y, width, height, 格式字符串, 参数1, 参数2,...);

  但有时仍需要对生成的字符串一些操作,这时就可以使用格式化字符串输出函数 sprintf()。 平时我们常用 printf() 将内容输出到控制台窗口,而 sprintf()把内容输出到字符数组里。这样就可以得到格式化输出的字符串,用于其它操作。

方法:
  先定义一个能容纳输出字符串的数组

char strBuffer[2];

  再使用 sprintf() 生成格式化字符串并存入 strBuffer 中。

sprintf(strBuffer,  今天是%d月%d日, 9, 2);

  这样,在 strBuffer 中我们就得到 今天是9月2日的字符串,

二、文字的设置

  对于文字输出,经常需要调整字体,大小,颜,对齐方式等,下面就列出关于这些设置相关的内容。
  设置只对之后的文字输出生效。 所以不能先输出文字再设置文字样式,设置之前已经绘制出的文字不会因为新的设置而改变。

1. 文字相关颜

1.1 文字颜

  文字颜即前景(默认是浅灰), 由 setcolor(color) 指定。如,设置文字颜为蓝。

setcolor(BLUE);
1.2 文字背景

  文字的背景, 由 setfontbkcolor(color) 指定(默认是白), 如,设置文字背景颜为白。

setfontbkcolor(WHITE)

  我们常常需要文字的背景颜是 透明 的,窗口什么颜,背景就是什么颜,不然一个字后面有一个块,把后面的图片挡住,很难看。

  这就用到 setbkmode() 函数, 参数可以选择设置文字的背景颜是透明还是使用当前文字背景
设置文字背景为透明

	setbkmode(TRASPARET);

设置文字背景为当前文字背景

	setbkmode(OPAQUE);

  下面的图中,可以看到两种文字背景颜模式的区别,透明背景模式的更自然。

2. 文字字体和大小

  使用setfont() 设置文字字体和大小,这个函数有四个重载。最常用的是

void setfont(int nHeight, int nWidth, LPCSTR lpszFace, PIMAGE pimg = ULL);

  比如,设置文字为高度为12 的宋体字,宽度自适应。( 这个高度是指 像素)

setfont(12, 0, 宋体);

  宽度自适应是根据高度自动调整宽度,以保证字体宽高比例。
  需要注意的是 ege_drawtext() 由于底层的实现是用GDI,和其它函数不同,所以输出的宽度可能会不太一样。

2.1 支持的字体

  支持系统已经安装的字体。
  在自己电脑桌面右击选择 “个性化”–>“字体” 查看。

2.2 字体显示测试

  下面做个字体样式显示测试。(可以往fontStyle数组里添加自己想要显示的字体,查看字体显示效果)

#include <graphics.h>int main()
{initgraph(800, 640, IIT_REDERMAUAL);			//初始化窗口setcaption(EGE字体样式);		//设置窗口标题setbkcolor(WHITE);				//设置窗口背景为白setcolor(BLACK);				//设置前景为黑setbkmode(TRASPARET);			//设置文字背景为透明ct char* fontStyle[] = {宋体,		楷体,		黑体,		微软雅黑, 	仿宋,Colas,	思源黑体, Romantic,	华文中宋,	华文仿宋 ,华文宋体, 	华文彩云,	华文新魏,	华文琥珀,	华文细黑,华文行楷,	幼圆,		新宋体,	隶书,		等线,方正姚体,	方正舒体,	Roboto,	Italic,Vineta BT,华文隶书, Tahoma, 汉仪南宫体简,};//计算字体样式数int len = sizeof(fontStyle) / sizeof(fontStyle[0]);//每一行显示的样式数int styleumOfOneLine = 5;//行之间的间隔int lineSpacing = 8, horizontalSpacing = 160;int fontHeight = 28;for (int i = 0; i < len; i) {setfont(fontHeight, 0, fontStyle[i]);int x = (i % styleumOfOneLine) * horizontalSpacing;int y = (i / styleumOfOneLine) * (fontHeight  lineSpacing);xyprintf(x, y, fontStyle[i]);}getch();closegraph();return 0;
}

. 文字样式(加粗,斜体,下划线,删除线等)

  setfont() 还有其他的重载函数,可以设置下划线,斜体,角度,删除线,剪辑精度,输出质量,笔画粗细,等。

  具体请参考库函数文档文字输出部分,这里不再另作说明 EGE库函数文档:setfont()

  字体样式的一个结构体 LOGFOT ,

struct LOGFOT {LOG lfHeight;				//高度LOG lfWidth 				//宽度LOG lfEscapement;			//字符串书写角度LOG lfOrientation;			//字的书写角度LOG lfWeight;				//笔画粗细BYTE lfItalic;				//是否斜体BYTE lfUnderline;			//字体是否有下划线BYTE lfStrikeOut;			//字体是否有删除线BYTE lfCharSet;				//指定字符集BYTE lfOutPrecision;BYTE lfClipPrecision;BYTE lfQuality;BYTE lfPitchAndFamily;TCHAR lfFaceame[LF_FACESIZE];
};

  获取当前字体样式

LOGFOT font;
getfont(&font);

  获取字体样式后,可以设置改变LOGFOT其中需要改变的属性,然后设置字体样式。

setfont(&font);

4. 文字对齐方式

  可以设置文字 水平对齐方式垂直对齐方式
  对齐方式适合 单行输出,如果是多行输出的话,可能只能设置水平左对齐水平右对齐
  在单行文字输出中,对齐就是文字坐标在文字的位置(文字坐标即输出文字时指定的坐标), 默认对齐方式是水平左对齐,垂直顶部对齐(也就是文字坐标在文字左上角),如果指定水平和垂直都中心对齐,那么文字坐标就会在文字中间。

  下面是指定文字对齐用的函数 settextjustify() 的声明。

void settextjustify(int horiz,			//水平对齐方式int vert,			//垂直对齐方式PIMAGE pimg = ULL
);

对齐参数可以选择下面几种枚举值

水平对齐方式有:左对齐,右对齐,中心对齐
垂直对齐方式有:顶部对齐,底部对齐,中心对齐

enum text_just { //水平对齐方式      LEFT_TEXT   = 0,CETER_TEXT = 1,RIGHT_TEXT  = 2,//垂直对齐方式BOTTOM_TEXT = 0,/* CETER_TEXT = 1,  already defined above */TOP_TEXT    = 2
};

使用示例:
  设置文字绘制到窗口时,水平和垂直方向都是中心对齐。PIMAGE参数为ULL时表示设置窗口,这也是默认参数,省略即可。

//设置文字对齐方式为水平中心对齐,垂直中心对齐
settextjustify(CETER_TEXT, CETER_TEXT);

5. 获取要输出的字符串的尺寸

  这个获取要输出字符串的宽高,是做一些适应性调整,比如文字泡,文字周围有框框,可以根据字符串的实际大小调整好框的大小。
  下面都是假设字符串输出为一行时的文本宽度。

  • 获取字符串的高 textheight(“字符串”);
  • 获取字符串的宽 textwidth(“字符串”);

三、文本文件内容显示

  这里给出一个读取文本文件内容并显示的例程,主要是C语言读取文件部分的知识。

1. 文本的编码设置

  需要注意文本文档的编码,如果编码不一致会导致 汉字输出乱码 ,中文系统一般默认使用 GBK编码或者GB212编码,所以可以保存为这两种。

  可以用记事本打开文本文档,选择另存为, 编码选择 ASI(即当前系统使用的本地编码,中文系统则默认为GB212)。

2. 文件的打开

使用 fopen() 函数打开文件:

#include <stdio.h>
FILE* fp = fopen(文本文件名.txt, r);
if (fp == ULL) {打开文件失败
}

. 文件的读取

  先创建个缓存区,足够容纳一行的内容。为了简便,文件的一行不是很长,长了的话需要自己处理一下绘制位置。

下面一行一行地读取文本内容:

char buffer[1024];while (!feof(fp)) {buffer[0] = 	\0	;fgets(buff, 1024, fp);	//读取一行if (buffer[0] == 	\0	) {//文件结束,没有读取到新内容,退出break;}//一行内容已经读取进buff中了,这里做输出处理puts(buffer);
}

完整示例程序:

#include <graphics.h>
#include <stdio.h>int main()
{initgraph(800, 640, IIT_REDERMAUAL);setbkcolor(WHITE);//打开文件FILE* fp = fopen(吹梦到西洲.txt, r);if (fp == ULL) {xyprintf(0, 0, 打开文件失败);getch();return -1;}setcolor(BLACK);int titleHeight = 40;setfont(40, 0, 楷体);xyprintf((800 - textwidth(吹梦到西洲)) / 2, 0, 吹梦到西洲);int fontHeight = 20;setfont(fontHeight, 0, 楷体);int x = 40, y = titleHeight  20;char readBuffer[1024] = ;			// 输入缓冲区while (!feof(fp)) {readBuffer[0] = 	\0	;			// 输入缓冲区置为空字符串fgets(readBuffer, 1024, fp);if (readBuffer[0] == 	\0	)		// 如果没有读取到内容(文件结束),退出break;xyprintf(x, y, readBuffer);//计算下一行的位置y = fontHeight;//大于每页的长度,换页if (y  fontHeight > 600) {//转到另一页起始位置x = 400;y = titleHeight  20;//超过显示区域,不再输出if (x > 800)break;}}fclose(fp);getch();closegraph();return 0;
}

下图为原txt文件中的内容

运行结果

  实际上很多时候一行文字很多,超出宽度,就会出现被覆盖的情况。这时就要用 rectprintf() 了,内容超出行宽后会自动换行输出,但是因为是一行一行地读取输出的,需要自己用 textwidth() 判断一行内容的长度,计算输出了多少行,如果真要弄起来也挺麻烦的,EGE本身给出的接口不足。

怎么计算呢?
  指定用 rectprintf() 在区域内输出,因为超出宽度后会自动换行,但是我们需要知道它实际输出了多少行,才能知道下一次输出的位置。我们只要用 字符串总宽度除以行宽, 向上取整即可得到输出的行数(实际上也不是很可靠,因为末尾不够输出一个字的时候会换行,这时就会算错)
  所以计算方式如下:( / 是整除)
  输出行数 = (字符串总宽度  行宽 - 1) / 行宽

  下面则是把多行并做一行,然后显示超出一行的宽度示例:

#include <graphics.h>
#include <stdio.h>int main()
{ct int SCR_WIDTH = 800, SCR_HEIGHT = 700;initgraph(SCR_WIDTH, SCR_HEIGHT, IIT_REDERMAUAL);setbkcolor(WHITE);//打开文件FILE* fp = fopen(吹梦到西洲.txt, r);if (fp == ULL) {xyprintf(0, 0, 打开文件失败);getch();return -1;}setcolor(BLACK);int titleHeight = 40;setfont(40, 0, 楷体);xyprintf((SCR_WIDTH - textwidth(吹梦到西洲)) / 2, 0, 吹梦到西洲);int fontHeight = 20;setfont(fontHeight, 0, 楷体);int x = 40, yBase = titleHeight  20, y = yBase;char outputBuffer[1024  4] =     ;	//输出缓冲区,一行前面4个空格(两个汉字宽)char* readBuffer = &outputBuffer[4];	//输入缓冲区,首地址在输出缓冲区往后偏移4个字符位置int c = feof(fp);while (!feof(fp)) {readBuffer[0] = 	\0	;			//读取前置为空字符串fgets(readBuffer, 1024, fp);	//读取一行文本if (readBuffer[0] == 	\0	)		//如果没有读到内容,退出循环break;//多行输出:将输出缓冲区outputBuffer的内容输出到窗口相应的位置rectprintf(x, y, SCR_WIDTH - 2 * x, SCR_HEIGHT - y, outputBuffer);//计算一下输出了多少行高度, 向上取整int width = textwidth(outputBuffer);int lineCount = (width  SCR_WIDTH - 2 * x - 1) / (SCR_WIDTH - 2 * x);//输出区域往下移y = lineCount * fontHeight;//超出显示范围if (y >= SCR_HEIGHT) {break;}}fclose(fp);getch();closegraph();return 0;
}

TXT文件原内容

运行截图:


EGE专栏:EGE专栏

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/794845.html

相关标签:无
上传时间: 2024-01-10 11:57:23
留言与评论(共有 7 条评论)
本站网友 360杀毒卸载不了
11分钟前 发表
CETER_TEXT); 5. 获取要输出的字符串的尺寸   这个获取要输出字符串的宽高,是做一些适应性调整,比如文字泡,文字周围有框框,可以根据字符串的实际大小调整好框的大小
本站网友 婴儿打呼噜
25分钟前 发表
及汉字标点符号占两个字符宽度
本站网友 国务委员名单
18分钟前 发表
文字的设置1. 文字相关颜1.1 文字颜1.2 文字背景 2. 文字字体和大小2.1 支持的字体2.2 字体显示测试 . 文字样式(加粗,斜体,下划线,删除线等)4. 文字对齐方式5. 获取要输出的字符串的尺寸 三
本站网友 可预见的非理性
11分钟前 发表
2.2 字体显示测试   下面做个字体样式显示测试
本站网友 无限极是传销吗
18分钟前 发表
0
本站网友 标准餐桌尺寸
3分钟前 发表
  所以我们一般都会加上一个设置