setfont 不是标准C语言库(如ANSI C)的一部分,它是一个特定于DOS操作系统的图形函数,主要用于在DOS的图形模式下改变当前输出的字体。

(图片来源网络,侵删)
你无法在Windows、Linux、macOS等现代操作系统上使用这个函数,如果你想在现代C语言环境中处理字体,你需要使用特定平台的API,
- Windows: GDI (Graphics Device Interface) 或 DirectWrite
- Linux: X11, Cairo, Pango
- macOS: Core Graphics, Core Text
- 跨平台: SDL, FreeType (用于字体光栅化)
setfont 在DOS环境中的详细说明
setfont 函数通常与Borland C++ (Turbo C++) 等早期的DOS C编译器一起提供,用于图形界面编程。
函数原型
#include <graphics.h> // 必须包含这个头文件 void far setfont(char far *fontname, int charsize, char far *fontfile);
参数详解
-
char far *fontname(字体名称)- 这是一个指向以
'\0'结尾的字符串的指针,字符串包含了你想要设置的字体名称。 - 字体名称通常是一个8.3格式的文件名(
trip.chr),并且这个字体文件必须位于当前目录或FONT目录下。 - 一些常见的内置字体名称包括:
trip.chr: 三重字体(Triplex Font)litt.chr: 小字体sans.chr: 无衬线字体goth.chr: 哥特字体
- 如果传入
NULL,则使用默认字体。
- 这是一个指向以
-
int charsize(字符大小)
(图片来源网络,侵删)- 这是一个整数,用于指定字体的大小(以像素为单位)。
- 你通常使用一个枚举值来设置它,
DEFAULT_FONT: 使用字体文件中定义的默认大小。USER_FONT: 允许你通过fontfile参数传入自定义字体数据。
- 也可以直接传入一个像素值,
8,10,12等,但这取决于字体文件是否支持该大小。
-
char far *fontfile(字体文件)- 这是一个指向自定义字体数据的指针。
- 只有当
charsize参数设置为USER_FONT时,这个参数才有效。 - 它指向一个包含字体位图数据的内存块,这个数据块的结构通常需要你自己按照特定格式构建,或者从
.chr文件中读取并解析。 charsize不是USER_FONT,此参数通常被忽略,可以设为NULL。
功能和用法
setfont 函数的主要作用是改变后续通过 outtextxy() 或 outtext() 函数输出的文本的样式。
工作流程:
- 初始化图形模式: 首先必须调用
initgraph()函数将屏幕设置为图形模式。 - 加载字体: 调用
setfont()来加载并设置你想要的字体。 - 输出文本: 使用
outtextxy()等函数在屏幕上绘制文本,这些文本就会以你设置的字体显示。
完整的DOS环境示例
以下是一个使用 Borland C++ 的完整示例,演示如何使用 setfont。

(图片来源网络,侵删)
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
int main() {
// 1. 初始化图形驱动
int gd = DETECT, gm;
initgraph(&gd, &gm, "C:\\TC\\BGI"); // 请确保你的BGI路径正确
// 2. 设置背景色和前景色
setbkcolor(WHITE);
setcolor(BLUE);
cleardevice();
// 3. 输出默认字体
outtextxy(100, 50, "这是默认字体 (litt.chr)");
// 4. 设置为三重字体 (trip.chr),大小为三倍
setfont(trip_font, 3, NULL);
outtextxy(100, 150, "这是三重字体 (trip.chr, 3x)");
// 5. 设置为哥特字体 (goth.chr),默认大小
setfont(goth_font, 0, NULL);
outtextxy(100, 250, "这是哥特字体 (goth.chr)");
// 6. 等待用户按键
getch();
// 7. 关闭图形模式,返回文本模式
closegraph();
return 0;
}
编译和运行说明:
- 你需要在一个支持BGI库的DOS环境或模拟器(如DOSBox)中编译和运行此代码。
initgraph中的路径需要指向你的编译器安装目录下的BGI文件夹,该文件夹包含了trip.chr,litt.chr等字体文件。
现代C语言环境中的字体处理(对比)
由于 setfont 已经过时,了解如何在现代环境中处理字体非常重要,这里以 Windows GDI 为例。
Windows GDI 示例
在Windows中,你不能直接“设置字体”,而是需要:
- 获取设备上下文:获取对窗口或屏幕绘图区域的访问权。
- 创建字体:使用
CreateFont或CreateFontIndirect函数创建一个字体对象。 - 选择字体:将创建的字体对象“选择”到设备上下文中。
- 绘制文本:使用
TextOut或DrawText函数绘制文本。 - 清理资源:用完后,必须删除创建的字体对象。
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void DrawTextWithCustomFont(HDC hdc);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 窗口类注册、创建窗口、消息循环等标准Windows代码...
// ... (此处省略标准窗口创建代码)
// 假设我们已经有一个名为 hWnd 的窗口句柄
HDC hdc = GetDC(hWnd);
DrawTextWithCustomFont(hdc);
ReleaseDC(hWnd, hdc);
// ... (消息循环)
return 0;
}
void DrawTextWithCustomFont(HDC hdc) {
// 1. 创建字体对象
// 创建一个24像素高的“Arial”粗体字体
HFONT hFont = CreateFont(
24, // 字体高度
0, // 字体宽度 (0表示自动)
0, // 字符倾斜度 (0表示不倾斜)
0, // 字符旋转度 (0表示不旋转)
FW_BOLD, // 字体粗细 (粗体)
FALSE, // 是否斜体
FALSE, // 是否有下划线
FALSE, // 是否有删除线
ANSI_CHARSET, // 字符集
OUT_DEFAULT_PRECIS, // 输出精度
CLIP_DEFAULT_PRECIS, // 裁剪精度
ANTIALIASED_QUALITY, // 输出质量
DEFAULT_PITCH | FF_SWISS, // 字体间距和族
TEXT("Arial") // 字体名称
);
if (hFont == NULL) {
MessageBox(NULL, "无法创建字体!", "错误", MB_OK);
return;
}
// 2. 将字体选入设备上下文,并保存旧的字体
HFONT hOldFont = (HFONT)SelectObject(hdc, hFont);
// 3. 设置文本颜色并绘制
SetTextColor(hdc, RGB(0, 0, 255)); // 蓝色文本
TextOut(hdc, 50, 50, "这是使用Windows GDI绘制的自定义字体", 30);
// 4. 恢复旧的字体并删除新创建的字体
SelectObject(hdc, hOldFont);
DeleteObject(hFont); // 重要!必须删除GDI对象以防止内存泄漏
}
| 特性 | DOS setfont |
现代 API (如Windows GDI) |
|---|---|---|
| 平台 | 仅限DOS | Windows, Linux, macOS等 |
| 库 | BGI (Borland Graphics Interface) | 平台特定API (GDI, DirectWrite, X11等) |
| 使用方式 | 简单,直接调用 setfont() 复杂 |
需要获取上下文、创建对象、选择对象、绘制、最后删除对象 |
| 灵活性 | 低,依赖预定义的.chr文件 |
高,可以精确控制字体大小、样式、颜色等 |
| 现代性 | 已过时 | 当前标准 |
如果你在学习计算机历史的早期图形编程,setfont 是一个有趣的概念,但对于任何实际的现代软件开发项目,你必须忘记 setfont,并学习你所开发平台提供的字体API。
