如果不仅仅想指定字符内容输出的起始坐标,还想整体控制全部内容的位置,以及内容的格式,可以尝试 drawtex 那函数。

其函数原型如下:

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

前者是输出字符串,后者是输出单个字符。我们重点来说一下第二个参数,这是一个 RECT 结构体类型的结构体指针,其结构原型如下:

typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;


它指定的矩形区域的指针。说白了就是四个值的结构体,分别表示了这个矩形区域的左上角位置、右下角位置,即锁定了这片区域。

再来看第三个参数,UINT 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_NOFULLWIDTHCHARBREAKWindows 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截去无法容纳的文字,并在末尾增加省略号。


三个参数都介绍完,那么可以试试了,比如我们需要在0, 0, 200, 200这个区域里,写一个默认白色,背景亮红色的字,且左右和上下都居中显示,那么可以使用DT_CENTER、DT_VCENTER 、DT_SINGLELINE三个参数用按位或|连接,完整代码如下:

//www.dotcpp.com
#include <graphics.h>        // 引用图形库头文件
#include <conio.h>
int main()
{
	int a;
	char str[100]="www.dotcpp.com";
        initgraph(640, 480);   // 创建绘图窗口,大小为 640x480 像素
	RECT r = {0, 0, 200, 200};
	setbkcolor(LIGHTRED);
	drawtext(str, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	getch();            // 按任意键继续
    closegraph();           // 关闭绘图窗口
    return 0;
}

默认背景色是和窗口黑色是一样的,我们这里用setbkcolor改了背景色,最终效果如图:

指定区域指定格式输出内容


大家可以再更改字体颜色、其他背景色,以及矩阵大小,还有第三个参数来调整文字的样式


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)