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

Direct2D/DirectWrite 文字測量完整指南:從 TextFormat 到 TextLayout

     編輯:關於C

GDI 透過 GetTextExtentPoint32 即可輕鬆測量文字尺寸,但 Direct2D 架構分離了字體(IDWriteTextFormat)與排版(IDWriteTextLayout),測量流程較為迂迴。本文詳解關鍵介面串聯流程,附完整代碼片段。

核心架構:兩層抽象

  • IDWriteTextFormat:對應 GDI 的「字體物件」,定義字型、大小、粗細、斜體等屬性
  • IDWriteTextLayout:對應「排版引擎」,綁定具體文字內容、排版寬高、換行規則,並提供 度量資訊

步驟 1:建立 TextFormat

IDWriteFactory* pDWriteFactory = GetDirectWriteFactory(); // 單例取得
IDWriteTextFormat* pTextFormat = nullptr;

HRESULT hr = pDWriteFactory->CreateTextFormat(
    L"Microsoft JhengHei",      // 字型名稱
    nullptr,                    // 字型集合(null 使用系統預設)
    DWRITE_FONT_WEIGHT_NORMAL,  // 粗細
    DWRITE_FONT_STYLE_NORMAL,   // 樣式
    DWRITE_FONT_STRETCH_NORMAL, // 伸縮
    16.0f,                      // 字體大小 (DIP)
    L"",                        // 語系(空字串 = 使用者預設)
    &pTextFormat
);

if (SUCCEEDED(hr)) {
    pTextFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP); // 單行模式
}

步驟 2:建立 TextLayout 並取得度量

IDWriteTextLayout* pTextLayout = nullptr;
const WCHAR* text = L"測試文字";
UINT32 length = wcslen(text);

hr = pDWriteFactory->CreateTextLayout(
    text, length,
    pTextFormat,
    0.0f, 0.0f,               // 排版寬高(0 = 無限制)
    &pTextLayout
);

if (SUCCEEDED(hr)) {
    DWRITE_TEXT_METRICS metrics;
    hr = pTextLayout->GetMetrics(&metrics);
    if (SUCCEEDED(hr)) {
        // 關鍵尺寸:含尾隨空白寬度、高度
        float width  = ceilf(metrics.widthIncludingTrailingWhitespace);
        float height = ceilf(metrics.height);
        // 使用 width/height 進行佈局計算...
    }
    pTextLayout->Release();
}

關鍵度量欄位說明

欄位含義
width不含尾隨空白的排版寬度
widthIncludingTrailingWhitespace含尾隨空白寬度(通常用於佈局)
height排版高度(含行距)
layoutWidth/Height建構時指定的最大排版框尺寸
maxBidiReorderingDepth雙向文字重排深度

常見坑點與建議

  1. 釋放順序:先 TextLayout,再 TextFormat,最後 Factory(通常為單例不釋放)
  2. DIP vs 像素:DirectWrite 使用裝置獨立像素 (DIP, 1/96 吋),轉螢幕像素需乘以 DPI/96
  3. 字型回退:指定字型缺字時自動回退,度量結果可能跨字型,需注意
  4. 快取策略:相同字體+文字的 TextLayout 可快取重用,避免重複建構

應用展望:WPF 風格自動佈局

掌握文字測量後,可構建類 WPF 的保留模式 GUI 框架:

  • 元素樹結構 + 佈局引擎
  • Measure/Arrange 兩階段佈局
  • 支援 Direct2D/GDI 雙引擎切換渲染
  • 內建動畫、模板、樣式系統

文中截圖展示的 Win7 風格按鈕(含漸層、動畫、自動對齊),即由此佈局系統驅動,而非硬編碼座標。

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