首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

DOS 圖形模式下中文顯示技術:HZK16/HZK24 字庫直接繪製

     編輯:關於C語言

Turbo C 時代經典技術:無需中文系統支援,直接讀取 HZK16/HZK24 字庫檔案,於圖形模式 (BGI) 逐點繪製中文字元。

核心流程

  1. 開啟字庫:open("HZK16", O_RDONLY|O_BINARY) 取得檔案控制代碼。
  2. 計算字庫索引:國標碼區位轉換為字庫偏移。
    • 高位元組區碼:c1 = (byte1 - 0xA1) & 0x7F
    • 低位元組位碼:c2 = (byte2 - 0xA1) & 0x7F
    • 16x16 點陣:offset = (c1 * 94 + c2) * 32 (每字 32 位元組)
    • 24x24 點陣:offset = ((c1-15) * 94 + c2) * 72 (每字 72 位元組,常用字區從 16 區開始)
  3. 讀取點陣資料:read(handle, buffer, 32/72)。
  4. 逐點繪製:解析每位元組的 8 個位元,呼叫 putpixel(x, y, color) 繪製前景色像素。
  5. 關閉字庫:close(handle)。

關鍵函式實作

16x16 點陣顯示

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); }

24x24 點陣與放大顯示

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();
}

技術背景補充

  • HZK16/HZK24:早期中文系統 (UCDOS、ET、CCDOS) 內建字庫,廣泛用於 DOS 時代中文軟體開發。
  • BGI (Borland Graphics Interface):Turbo C 內建圖形庫,支援 VGA/EGA/CGA 等顯示模式。
  • 現代 Windows 開發請使用 GDI/GDI+/DirectWrite 系統級字型渲染,本文純屬歷史技術檔案。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved