2016-11-15 21 views
0

基本上,給出下面的測試代碼:呼叫若要ID2D1RenderTarget :: DrawTextLayout()不工作

CComPtr<IDWriteTextLayout> layout; 
wstring text2 = L"Here is some text."; 
this->currentLevelText->Formatting->TextFactory->CreateTextLayout(text2.c_str(), text2.length(), this->matrixHeaderTextInfo->TextFormat, FLT_MAX, FLT_MAX, &layout); 
target->DrawTextLayout(D2D1::Point2F(30, 30), layout, this->textBrush); 

的靶> DrawTextLayout方法沒有繪製任何東西。然而,DrawTextW以下調用做的工作:

target->DrawTextW(this->currentLevelText->Text.c_str(), this->currentLevelText->Text.length(), 
    this->currentLevelText->Formatting->TextFormat, this->currentLevelText->ActualRectangle.DrawingRectangle, 
    this->textBrush); 

這裏是我所知道的一個總結:

  • TextFactory是一個指向IDWriteFactory對象的TextFormat是IDWriteTextFormat對象和目標是一個有效的ID2D1HwndRenderTarget。
  • TextFormat是一個有效的IDWriteTextFormat對象,因爲我可以通過DrawTextW方法正確地繪製文本。
  • 對CreateTextLayout的調用不會返回錯誤代碼,它會返回S_OK成功代碼。
  • TextFormat和文本佈局對象都是使用相同的DirectWrite工廠創建的,這也是我的應用程序中唯一存在的DirectWrite工廠。
  • ID2D1SolidColorBrush textBrush是一個不透明度爲1.0並且設置爲黑色的有效筆刷。我知道這不是問題,因爲DrawTextW正在使用此畫筆成功繪製到窗口。
  • 調用ID2D1TextLayout對象的GetMetrics方法將返回有效的度量標準;換句話說,存儲在對象中的文本的寬度和高度不是0或負數。
  • 對ID2D1RenderTarget :: EndDraw()的調用不返回錯誤代碼,它返回S_OK成功代碼。
  • 最讓我莫名其妙的是,在我的代碼的另一部分(碰巧在另一個dll文件中),調用DrawTextLayout 的工作。即使此代碼位於dll文件中,它也使用相同的DirectWrite Factory。我真的不認爲在另一個DLL文件應該有所作爲。

我提供的兩個代碼示例一個接一個地執行,並且都應成功繪製文本。但是,只有DrawTextW正在繪製文本。我沒有做任何複雜的繪畫工作,例如使用Direct 2D Effects。代碼並不比我提供的樣本更復雜。現在,我可以使用DrawTextW方法,但我不想,因爲我讀的地方只是創建一個IDWriteTextLayout對象,繪製它,然後銷燬該對象。這是很多不必要的工作,可以通過我自己使用文本佈局對象來緩解。

有沒有人知道爲什麼會發生這種情況?我完全沒有意識到爲什麼會發生這種情況,儘管我會繼續嘗試在某處找到連接。

回答

0

我相信我找到了修復程序。 TextFormat對象是通過DWRITE_PARAGRAPH_ALIGNMENT_CENTER的段落對齊,DWRITE_TEXT_ALIGNMENT_CENTER的文本對齊創建的,並且該佈局具有FLT_MAX的邊界框大小(模擬無邊界,因此文本將永遠不會被強制換行)。

我沒有意識到這一點,但DWRITE_PARAGRAPH_ALIGNMENT指的是垂直對齊的文字。 DWRITE_PARAGRAPH_ALIGNMENT_NEAR表示對齊頂部,DWRITE_PARAGRAPH_ALIGNMENT_FAR表示對齊底部,而DWRITE_PARAGRAPH_ALIGNMENT_CENTER表示垂直對齊中心。

因爲佈局容器是FLT_MAX * FLT_MAX,所以無論我指定什麼原點位置,文本都不會在屏幕上的任何位置可見,因爲在x和y中它總是大約FLT_MAX/2像素方向。

將文本格式的段落對齊從DWRITE_PARAGRAPH_ALIGNMENT_CENTER更改爲DWRITE_PARAGRAPH_ALIGNMENT_NEAR是修復問題的第一步。但是,我注意到文本仍然沒有顯示出來。我意識到DWRITE_TEXT_ALIGNMENT_CENTER也不會與FLT_MAX寬度一起工作,這是因爲段落對齊不像我期待的那樣。在有FLT_MAX寬度繪製時將文本居中,同樣,將文本路徑從屏幕向右移動。因此,即使使用FLT_MAX到目前爲止還沒有給我提供任何問題(直到現在我還沒有必要使用居中對齊),給出了佈局的具體大小限制,並使用「Near」段落對齊是什麼解決了我的問題。