page contents

C语言——图形库文字输出相关函数

C语言——图形库文字输出相关函数

一、gettextcolor

这个函数用于获取当前文字颜色。

COLORREF gettextcolor();

参数:

(无)

返回值:

返回当前的文字颜色。

示例:

(无)

请参阅:

settextcolor gettextstyle settextstyle

二、drawtext

这个函数用于在指定区域内以指定格式输出字符串。

int drawtext(
	LPCTSTR str,
	RECT* pRect,
	UINT uFormat
);
int drawtext(
	TCHAR c,
	RECT* pRect,
	UINT uFormat
);

参数:

str 待输出的字符串。 pRect 指定的矩形区域的指针。某些 uFormat 标志会使用这个矩形区域做返回值。详见后文说明。 uFormat 指定格式化输出文字的方法。详见后文说明。 c 待输出的字符。

返回值:

函数执行成功时,返回文字的高度。

如果指定了 DT_VCENTER 或 DT_BOTTOM 标志,返回值表示从 pRect->top 到输出文字的底部的偏移量。

如果函数执行失败,返回 0。

说明:

默认情况下,输出字符串的背景会用当前背景色填充。使用函数 setbkmode 可以设置文字的背景部分保持透明或使用背景色填充。

以下是 uFormat 参数可以使用的设置项,用来设置文字输出时的格式:

DT_BOTTOM 调整文字位置到矩形底部,仅当和 DT_SINGLELINE 一起使用时有效。
DT_CALCRECT 检测矩形的宽高。如果有多行文字,drawtext 使用 pRect 指定的宽度,并且扩展矩形的底部以容纳每一行文字。如果只有一行文字,drawtext 修改 pRect 的右边以容纳最后一个文字。无论哪种情况,drawtext 都返回格式化后的文字高度,并且不输出文字。
DT_CENTER 文字水平居中。
DT_EDITCONTROL 以单行编辑的方式复制可见文本。具体的说,就是以字符的平均宽度为计算依据,同时用这个方式应用于编辑控制,并且这种方式不显示可见部分的最后一行。
DT_END_ELLIPSIS 对于文本显示,如果字符串的末字符不在矩形内,它会被截断并以省略号标识。 如果是一个单词而不是一个字符,其末尾超出了矩形范围,它不会被截断。
字符串不会被修改,除非指定了 DT_MODIFYSTRING 标志。
DT_EXPANDTABS 展开 TAB 符号。 默认每个 TAB 占8个字符位置。注意,DT_WORD_ELLIPSIS、DT_PATH_ELLIPSIS 和 DT_END_ELLIPSIS 不能和 DT_EXPANDTABS 一起用。
DT_EXTERNALLEADING 在行高里包含字体的行间距。通常情况下,行间距不被包含在正文的行高里。
DT_HIDEPREFIX Windows 2000/XP: 忽略文字中的前缀字符(&),并且前缀字符后面的字符不会出现下划线。其他前缀字符仍会被处理。例如:
输入字符串:		"A&bc&&d"
通常输出:		"Abc&d"
DTDT_HIDEPREFIX:	"Abc&d"
DT_INTERNAL 使用系统字体计算文字的宽高等属性。
DT_LEFT 文字左对齐。
DT_MODIFYSTRING 修改指定字符串为显示出的正文。仅当和 DT_END_ELLIPSIS 或 DT_PATH_ELLIPSIS 标志同时使用时有效。
DT_NOCLIP 使输出文字不受 pRect 裁剪限制。使用 DT_NOCLIP 会使 drawtext 执行稍快一些。
DT_NOFULLWIDTHCHARBREAK Windows 2000/XP: 防止换行符插入到 DBCS (double-wide character string,即宽字符串),换行规则相当于 SBCS 字符串。仅当和 DT_WORDBREAK 一起使用时有效。例如,汉字就是宽字符,设置该标志后,连续的汉字会像英文单词一样不被换行符中断。
DT_NOPREFIX 关闭前缀字符的处理。通常,DrawText 解释前缀转义符 & 为其后的字符加下划线,解释 && 为显示单个 &。指定 DT_NOPREFIX,这种处理被关闭。例如:
输入字符串:	"A&bc&&d"
通常输出:	"Abc&d"
DT_NOPREFIX:	"A&bc&&d"
DT_PATH_ELLIPSIS 对于显示的文字,用省略号替换字符串中间的字符以便容纳于矩形内。如果字符串包含反斜杠(\),DT_PATH_ELLIPSIS 尽可能的保留最后一个反斜杠后面的文字。
字符串不会被修改,除非指定了DT_MODIFYSTRING标志。
DT_PREFIXONLY Windows 2000/XP:仅仅在(&)前缀字符的位置下绘制一个下划线。不绘制字符串中的任何其他字符。例如:
输入字符串:	"A&bc&&d"
通常输出:	"Abc&d"
DT_PREFIXONLY:	" _   "
DT_RIGHT 文字右对齐。
DT_RTLREADING 设置从右向左的阅读顺序(当文字是希伯来文或阿拉伯文时)。默认的阅读顺序是从左向右。
DT_SINGLELINE 使文字显示在一行。回车和换行符都无效。
DT_TABSTOP 设置 TAB 制表位。uFormat 的 15–8 位指定 TAB 的字符宽度。默认 TAB 表示 8 个字符宽度。注意,DT_CALCRECT、DT_EXTERNALLEADING、DT_INTERNAL、DT_NOCLIP 和 DT_NOPREFIX 不能和 DT_TABSTOP 一起用。
DT_TOP 文字顶部对齐。
DT_VCENTER 文字垂直居中。仅当和 DT_SINGLELINE 一起使用时有效。
DT_WORDBREAK 自动换行。当文字超过右边界时会自动换行(不拆开单词)。回车符同样可以换行。
DT_WORD_ELLIPSIS 截去无法容纳的文字,并在末尾增加省略号。

示例:

以下范例在屏幕中央输出字符串“Hello World”:

#include <graphics.h>
#include <conio.h>

int main()
{
	// 绘图环境初始化
	initgraph(640, 480);

	// 在屏幕中央输出字符串
	RECT r = {0, 0, 639, 479};
	drawtext(_T("Hello World"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	// 按任意键退出
	_getch();
	closegraph();
}

三、gettextstyle

这个函数用于获取当前字体样式。

void gettextstyle(LOGFONT *font);

参数:

font 指向 LOGFONT 结构体的指针。

返回值:

(无)

示例:

请参见 settextstyle 函数的示例。

四、outtext

这个函数用于在当前位置输出字符串。

void outtext(LPCTSTR str);
void outtext(TCHAR c);

参数:

str 待输出的字符串的指针。 c 待输出的字符。

返回值:

(无)

说明:

该函数会改变当前位置至字符串末尾。所以,可以连续使用该函数使输出的字符串保持连续。

示例:

// 输出字符串
char s[] = "Hello World";
outtext(s);
// 输出字符
char c = 'A';
outtext(c);
// 输出数值,先将数字格式化输出为字符串
char s[5];
sprintf(s, "%d", 1024);
outtext(s);

五、outtextxy

这个函数用于在指定位置输出字符串。

void outtextxy(
    int x,
    int y,
    LPCTSTR str
);
void outtextxy(
    int x,
    int y,
    TCHAR c
);

参数:

x 字符串输出时头字母的 x 轴的坐标值 y 字符串输出时头字母的 y 轴的坐标值。 str 待输出的字符串的指针。 c 待输出的字符。

返回值:

(无)

说明:

该函数不会改变当前位置。

字符串常见的编码有两种:MBCS 和 Unicode。VC6 新建的项目默认为 MBCS 编码,VC2008 及高版本的 VC 默认为 Unicode 编码。LPCTSTR 可以同时适应两种编码。为了适应两种编码,请使用 TCHAR 字符串及相关函数。

默认情况下,输出字符串的背景会用当前背景色填充。使用函数 setbkmode 可以设置文字的背景部分保持透明或使用背景色填充。

示例:

// 输出字符串 (VC6)
char s[] = "Hello World";
outtextxy(10, 20, s);
// 输出字符串 (VC6 / VC2008 / VC2010 / VC2012)
TCHAR s[] = _T("Hello World");
outtextxy(10, 20, s);
// 输出字符 (VC6)
char c = 'A';
outtextxy(10, 40, c);
// 输出字符 (VC6 / VC2008 / VC2010 / VC2012)
TCHAR c = _T('A');
outtextxy(10, 40, c);
// 输出数值,先将数字格式化输出为字符串 (VC6)
char s[5];
sprintf(s, "%d", 1024);
outtextxy(10, 60, s);
// 输出数值 1024,先将数字格式化输出为字符串 (VC2008 / VC2010 / VC2012)
TCHAR s[5];
_stprintf(s, _T("%d"), 1024);        // 高版本 VC 推荐使用 _stprintf_s 函数
outtextxy(10, 60, s);

六、settextcolor

这个函数用于设置当前文字颜色。

void settextcolor(COLORREF color);

参数:

color

要设置的文字颜色。

返回值:

(无)

示例:

(无)

请参阅:

gettextcolor gettextstyle settextstyle

七、settextstyle

这个函数用于设置当前字体样式。

void settextstyle(
    int nHeight,
    int nWidth,
    LPCTSTR lpszFace
);
void settextstyle(
    int nHeight,
    int nWidth,
    LPCTSTR lpszFace,
    int nEscapement,
    int nOrientation,
    int nWeight,
    bool bItalic,
    bool bUnderline,
    bool bStrikeOut
);
void settextstyle(
    int nHeight,
    int nWidth,
    LPCTSTR lpszFace,
    int nEscapement,
    int nOrientation,
    int nWeight,
    bool bItalic,
    bool bUnderline,
    bool bStrikeOut,
    BYTE fbCharSet,
    BYTE fbOutPrecision,
    BYTE fbClipPrecision,
    BYTE fbQuality,
    BYTE fbPitchAndFamily
);
void settextstyle(const LOGFONT *font);

参数:

nHeight 指定高度(逻辑单位)。 nWidth 字符的平均宽度(逻辑单位)。如果为 0,则比例自适应。 lpszFace 字体名称。 nEscapement 字符串的书写角度,单位 0.1 度。 nOrientation 每个字符的书写角度,单位 0.1 度。 nWeight

字符的笔画粗细,范围 0~1000。0 表示默认粗细。使用数字或下表中定义的宏均可:

FW_DONTCARE 0
FW_THIN 100
FW_EXTRALIGHT 200
FW_ULTRALIGHT 200
FW_LIGHT 300
FW_NORMAL 400
FW_REGULAR 400
FW_MEDIUM 500
FW_SEMIBOLD 600
FW_DEMIBOLD 600
FW_BOLD 700
FW_EXTRABOLD 800
FW_ULTRABOLD 800
FW_HEAVY 900
FW_BLACK 900

bItalic 是否斜体,true / false。 bUnderline 是否有下划线,true / false。 bStrikeOut 是否有删除线,true / false。 fbCharSet 指定字符集(详见 LOGFONT 结构体)。 fbOutPrecision 指定文字的输出精度(详见 LOGFONT 结构体)。 fbClipPrecision 指定文字的剪辑精度(详见 LOGFONT 结构体)。 fbQuality 指定文字的输出质量(详见 LOGFONT 结构体)。 fbPitchAndFamily 指定以常规方式描述字体的字体系列(详见 LOGFONT 结构体)。 font 指向 LOGFONT 结构体的指针。

返回值:

(无)

示例:

// 设置当前字体为高 16 像素的“宋体”。(VC6 / VC2008 / VC2010 / VC2012)
settextstyle(16, 0, _T("宋体"));
outtextxy(0, 0, _T("测试"));
// 设置输出效果为抗锯齿 (VC6 / VC2008 / VC2010 / VC2012)
LOGFONT f;
gettextstyle(&f);                     // 获取当前字体设置
f.lfHeight = 48;                      // 设置字体高度为 48
_tcscpy(f.lfFaceName, _T("黑体"));    // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
settextstyle(&f);                     // 设置字体样式
outtextxy(0, 50, _T("抗锯齿效果"));

八、textheight

这个函数用于获取字符串实际占用的像素高度。

int textheight(LPCTSTR str);
int textheight(TCHAR c);

参数:

str 指定的字符串指针。 c 指定的字符。

返回值:

该字符串实际占用的像素高度。

示例:

(无)

九、textwidth

这个函数用于获取字符串实际占用的像素宽度。

int textwidth(LPCTSTR str);
int textwidth(TCHAR c);

参数:

str 指定的字符串指针。 c 指定的字符。

返回值:

该字符串实际占用的像素宽度。

示例:

(无)

  • 发表于 2021-10-06 16:51
  • 阅读 ( 967 )
  • 分类:C/C++开发

0 条评论

请先 登录 后评论
小威
小威

64 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章