2015-04-27 26 views
4

我需要在使用GDI和GDI +的現有C++代碼中使用DirectWrite(需要CFF支持和OTF功能支持)來轉換一些文本到位圖呈現例程。DirectWrite:Windows 7上的字符間距

我是新來的DirectWrite。花費一些時間研究現有功能的遷移和做一些原型需要什麼,我遇到了一個問題: 我的問題是DirectWrite(開箱即用)不支持字符間距調整(這是一個要求對於現有的應用程序),至少不是在Windows 7上。我知道它隨Windows 8一起提供,但對於這個現有應用程序的另一個要求是不幸在Windows 7上運行。

我到目前爲止的研究中發現,似乎要實現一個自定義的DirectWrite文本佈局,但我還沒有找到任何關於如何做到這一點的良好指南,特別是關於字符間距(關於如何創建自定義文本佈局方面的MSDN文檔/示例有點含糊不清)。

正如我之前所說的,在花費數天和/或數週研究和開發重新發明輪子之前,這一定是已經完成的,這裏有沒有人知道具有自定義字符間距的DirectWrite文本佈局的示例實現用作起點還是教程?

UPDATE1:不是一個答案,但 - 我發現了IDWriteTextLayout1接口(支持設置字符空格),不僅與Windows 8,但也與「Windows 7的平臺更新SP1」(KB 2670838)在Windows 7上,因爲我可以要求外部應用程序正常運行,這解決了我的問題,雖然它不能回答我的問題。

回答

2

由於bidi和line wrapping以及需要調用較低級別的API,所以自定義佈局非常複雜,但示例在這裏[https://msdn.microsoft.com/en-us/library/windows/desktop/dd941711(v=vs.85).aspx]。至於字符間距,一旦你從整形過程(IDWriteTextAnalyzer :: GetGlyphs)返回字形提前數組,只需在所有提前增加一個增量。在鏈接的SDK示例中,您可以在FlowLayout::ShapeGlyphRuns的內部添加一個for循環,以便它在換行和繪製之前發生。

STDMETHODIMP FlowLayout::ShapeGlyphRuns(IDWriteTextAnalyzer* textAnalyzer) 
{ 
... 
    hr = ShapeGlyphRun(textAnalyzer, runIndex, glyphStart); 
... 
    // Add additional character spacing to each trailing edge of each glyph. 
    for (auto& advance : glyphAdvances_) 
    { 
     advance += 5.0f; 
    } 
... 
} 

注意的API ApplyCharacterSpacing也被加入到Windows 8比,因爲它認爲與每個羣集多個字形複雜的腳本手動添加它自己更強大的(當然,如果你有一個API,那麼你也已經有IDWriteTextLayout::SetCharacterSpacing)。