1

ライブラリを使用FW1FontWrapperして、DirectX 11 C++ アプリケーションでフォントをラップしています。

でレンダリングされたテキストの行間隔 (テキストの 2 行間の距離) を変更したいFW1FontWrapper

私は DirectX で使用できることを知っていIDWriteTextFormat::SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, 30.0f, 20.0f)ます。

IDWriteTextFormat残念ながら、正しい構造にアクセスする方法がわかりません。

私はしようとしました:

HRESULT hResult = FW1CreateFactory(FW1_VERSION, &FW1Factory);
hResult = FW1Factory->CreateFontWrapper(device, L"Arial", &fontWrapper);

//my attemp - first get the IDWriteFactory
IDWriteFactory *pDWriteFactory;
hResult = fontWrapper->GetDWriteFactory(&pDWriteFactory);

//and now the IDWriteTextFormat 
IDWriteTextFormat *pTextFormat;
hResult = pDWriteFactory->CreateTextFormat(L"Arial", NULL, 
    DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, 
    DWRITE_FONT_STRETCH_NORMAL, 10.0f, L"", &pTextFormat);
pTextFormat->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, 100.f, 20.0f);

そのようにして、次の方法でレンダリングに影響を与えるものではなく、新しい を作成および変更するため、機能しないと思います。IDWriteTextFormat

fontWrapper->DrawString(
   context,
   s2ws(content).c_str(),// String
   fontSize,// Font size
   startTextPosition.getX(),// X position
   startTextPosition.getY(),// Y position
   color,// Text color, 0xAaBbGgRr
   FW1_RESTORESTATE// Flags (for example FW1_RESTORESTATE to keep 
        //context states unchanged)
 );

では、どのようにして権利にアクセスするのIDWriteTextFormatでしょうか (新しいものではなく、変更するときにレンダリングに影響を与えるもの)。

私の知る限り、FW1FontWrapper行間隔を設定する独自の方法はありません。

4

1 に答える 1

5

FW1FontWrapper モジュールのソース コードを見ると、アクセスできないDrawStringデフォルトが内部で使用されていることがわかりIDWriteTextFormatます。

DrawTextLayout解決策は、の代わりに使用することですDrawString

(変数名を使用して) これを行うには、最初にファクトリを作成IFW1FontWrapperし、既存のコードのようにします。

HRESULT hResult = FW1CreateFactory(FW1_VERSION, &FW1Factory);
hResult = FW1Factory->CreateFontWrapper(device, L"Arial", &fontWrapper);

次に、DWrite ファクトリを取得IDWriteTextFormatし、必要な行間隔で を作成します (これも既存のコードです)。

// get the DirectWrite factory used by the font-wrapper
IDWriteFactory *pDWriteFactory;
hResult = fontWrapper->GetDWriteFactory(&pDWriteFactory);

// create an IDWriteTextFormat and set line spacing
IDWriteTextFormat *pTextFormat;
hResult = pDWriteFactory->CreateTextFormat(L"Arial", NULL, 
    DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, 
    DWRITE_FONT_STRETCH_NORMAL, 10.0f, L"", &pTextFormat);
pTextFormat->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_UNIFORM, 100.f, 20.0f);

次に、IDWriteTextLayout(変数名を使用して) 文字列の を作成し、IDWriteTextFormat上記で作成した を使用します。

// create a DirectWrite text layout for the string
// using the above IDWriteTextFormat 
IDWriteTextLayout *pTextLayout;
unsigned int stringLength = s2ws(content).size();
hResult = pDWriteFactory->CreateTextLayout(
    s2ws(content).c_str(),
    stringLength,
    pTextFormat,
    0.0f,
    0.0f,
    &pTextLayout);

IDWriteTextLayoutオブジェクトのフォント サイズを設定します。

// set the required font size
DWRITE_TEXT_RANGE allText = {0, stringLength};
pTextLayout->SetFontSize(fontSize, allText);

そして最後に、DrawTextLayout(ここでも変数名を使用して) を使用してテキストを描画します。

// draw the text
fontWrapper->DrawTextLayout(
    context,
    pTextLayout,
    startTextPosition.getX(),
    startTextPosition.getX(),
    color,
    NULL,
    NULL,
    FW1_RESTORESTATE);

// tidy up interfaces
pTextLayout->Release();
pTextLayout = NULL;

私はあなたの既存のコードからいくつか間違った仮定をしたかもしれませんが、インスタンスをIDWriteTextFormat介して独自のものを使用し、代わりに. これが役立つことを願っています。IDWriteTextLayoutDrawTextLayoutDrawString

于 2013-09-14T13:07:36.877 に答える