CFontDialog dlg; dlg.m_cf.Flags |= CF_TTONLY;CDC::GetFontData 讀取 cmap 表,解析 Format 4 (Windows Unicode) 區段結構,獲得字符起始/結束碼。#define MAKETABLENAME(c1,c2,c3,c4) (((DWORD)c4<<24)|((DWORD)c3<<16)|((DWORD)c2<<8)|(DWORD)c1)
DWORD tag = MAKETABLENAME('c','m','a','p');
DWORD size = pFontDC->GetFontData(tag, 0, NULL, 0);
BYTE* buf = new BYTE[size];
pFontDC->GetFontData(tag, 0, buf, size);
// 解析 buf ... 參考 showttf.c 邏輯,提取 startchars/endchars 陣列
關鍵參數:
MAT2 mat2 = { {0,1}, {0,0}, {0,0}, {0,1} };(單位矩陣,無縮放旋轉)GLYPHMETRICS gm:回傳 gmBlackBoxX/Y(點陣寬高)、gmCellIncX(進位寬度)、gmptGlyphOrigin(原點偏移)。TEXTMETRIC tm:取得 tmAscent 計算基線。int iAdjust = (box_x + 3) & 0xFFFC; // DWORD 對齊
// 反鋸齒 2-bit/pixel (4 階)
width = (width % 4 == 0) ? width/4 : width/4 + 1;
for (y=0; y
完整函數 CreateFontMatrix 封裝上述邏輯,輸出點陣緩衝區、每列位元組數、高度、基線、字符寬高等資訊,方便直接繪製或快取。