基本上,給出下面的測試代碼:呼叫若要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對象,繪製它,然後銷燬該對象。這是很多不必要的工作,可以通過我自己使用文本佈局對象來緩解。
有沒有人知道爲什麼會發生這種情況?我完全沒有意識到爲什麼會發生這種情況,儘管我會繼續嘗試在某處找到連接。