Turbo C 時代經典技術:無需中文系統支援,直接讀取 HZK16/HZK24 字庫檔案,於圖形模式 (BGI) 逐點繪製中文字元。
open("HZK16", O_RDONLY|O_BINARY) 取得檔案控制代碼。c1 = (byte1 - 0xA1) & 0x7Fc2 = (byte2 - 0xA1) & 0x7Foffset = (c1 * 94 + c2) * 32 (每字 32 位元組)offset = ((c1-15) * 94 + c2) * 72 (每字 72 位元組,常用字區從 16 區開始)read(handle, buffer, 32/72)。putpixel(x, y, color) 繪製前景色像素。close(handle)。int OpenHz(const char* path) {
return open(path, O_RDONLY | O_BINARY);
}
int WrtHz16(int x, int y, int spacing, int color, char* str) {
unsigned char buffer[32];
while (*str) {
if (*str > 0xA1) { // 雙位元組中文字元
// 解析區位碼...
lseek(handle, offset, SEEK_SET);
read(handle, buffer, 32);
for (int row = 0; row < 16; row++)
for (int byte = 0; byte < 2; byte++)
for (int bit = 0; bit < 8; bit++)
if ((buffer[row*2+byte] >> (7-bit)) & 1)
putpixel(x + byte*8 + bit, y + row, color);
x += 16 + spacing;
}
str++;
}
return x;
}
int GetBit(unsigned char c, int n) { return (c >> n) & 1; }
void CloseHz() { close(handle); }
int WrtHz24(int x, int y, int spacing, int color, int scaleX, int scaleY, char* str) {
unsigned char buffer[72];
while (*str) {
if (*str > 0xA1) {
// 解析區位碼 (常用字區從 16 區開始)
lseek(handle, offset, SEEK_SET);
read(handle, buffer, 72);
for (int row = 0; row < 24*scaleY; row += scaleY)
for (int sy = 0; sy < scaleY; sy++)
for (int byte = 0; byte < 3; byte++)
for (int bit = 0; bit < 8; bit++)
if ((buffer[(row/scaleY)*3+byte] >> (7-bit)) & 1)
for (int sx = 0; sx < scaleX; sx++)
putpixel(x + byte*8*scaleX + bit*scaleX + sx,
y + row + sy, color);
x += 24*scaleX + spacing;
}
str++;
}
return x;
}
#include "hz.h" // 上述函式宣告
#include <graphics.h> #include <conio.h>
const char* HZ16_PATH = "C:\\UCDOS\\HZK16.FNT";
const char* HZ24_PATH = "C:\\UCDOS\\FNT\\HZK24S.FNT";
const char* TEXT = "苦丁香C語言輔助學習軟體";
void main() {
int gd = DETECT, gm;
initgraph(&gd, &gm, "C:\\TC\\BGI");
// 16x16 一般顯示
OpenHz(HZ16_PATH);
WrtHz16(20, 20, 4, RED, TEXT);
CloseHz();
// 24x24 放大 2x4 顯示
OpenHz(HZ24_PATH);
WrtHz24(20, 60, 4, RED, 2, 4, TEXT);
CloseHz();
getch(); closegraph();
}