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

C++ 使用 Uniscribe 進行文字自動換行計算與渲染

     編輯:關於C++

Uniscribe 簡介

Windows 2000+ 內建 usp10.dll,提供字符串渲染所需信息:換行機會、字符視覺順序、每字符大小等。MSDN 文檔:ScriptItemize 等。

渲染效果

核心流程

  1. 逐行處理:Uniscribe 單行處理,多行需自行分割。
  2. ScriptItemize:按腳本/語言分割為 Item。SCRIPT_ITEM 含 iCharPos 起始位置,末尾需額外一項計算長度。
  3. 合併樣式邊界:將 Item 邊界與字體樣式邊界交叉切割,得 Run(同一 Item 且同一樣式)。
  4. ScriptShape:Run 級調用,得 glyph 序列、屬性、邏輯簇映射 (pwLogClust)。glyph 與 wchar_t 非一一對應(合字、連字等)。
  5. ScriptPlace:得每 glyph 寬度 (piAdvance)、偏移 (pGoffset)、整體 ABC 寬度。
  6. ScriptBreak:得每 wchar_t 換行屬性 (fSoftBreak)、字/詞邊界 (fCharStop, fWordStop)。
  7. 渲染循環:按 Run 累加寬度,超寬時按 ScriptBreak 切分 Run,用 piAdvance 計算可容納 glyph 數,反查 pwLogClust 得 wchar_t 範圍,調用 TextOut 渲染。

關鍵難點

  • glyph 與 wchar_t 多對多映射處理(pwLogClust 解碼)。
  • Run 切分時保持 glyph 完整性。
  • 右到左腳本(阿拉伯文)未在文中展開。

完整代碼

文末附 GacUI + GDI 實現完整代碼(含 DocumentFragment 解析、字體創建、Uniscribe 調用封裝、渲染循環),資源文件 document.txt 可從 Codeplex 下載。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved