0

同じレンダーターゲットに複数のDirectWriteテキストオブジェクトがあり、そのうちの1つを一度に変換し、他のオブジェクトは変更しないようにしたい。Direct2Dには、いくつかのタイプの変換があります。

  • ターゲット変換をレンダリングする
  • ジオメトリ変換
  • ブラシ変換

レンダリングターゲット変換は、その上のすべてのオブジェクトに影響するため、使用できません

テキストはジオメトリではなく、IDWriteTextLayoutの変換メソッドがないため、ジオメトリ変換を使用できません。

したがって、私にとっての唯一の選択肢はブラシ変換ですが、ソリッドブラシを使用して変換された長方形を描画しようとすると、元の場所に描画されます(以下のコードを参照)。sdkデモはビットマップブラシ変換の例を示しています。だから私の質問は:変換は他のタイプのブラシでも機能しますか?しっかりしたブラシのように?

これが私のコードです。まず、経過時間に基づいて変換マトリックスを計算し、次にこのマトリックスを使用してブラシを変換し、最後に長方形を描画します。見て、これが事実かどうか、または他の方法でそれを行うことができるかどうかを教えてください。

VOID CalculateTranslationMatrix(D2D1_MATRIX_3X2_F* matrix) 
{ 
    static float totalTime = 0.0f; 

    // Get start time 
    static DWORD startTime = timeGetTime(); 

    // Get current time 
    DWORD currentTime = timeGetTime(); 

    // Calculate time elapsed 
    float timeElapsed = (currentTime - startTime) * 0.001f; 

    // Accumulate total time elapsed 
    totalTime += timeElapsed; 

    // Build up the translation matrix 
    matrix->_11 = 1.0f; 
    matrix->_12 = 0.0f; 
    matrix->_21 = 0.0f; 
    matrix->_22 = 1.0f; 
    matrix->_31 = totalTime; 
    matrix->_32 = totalTime; 
} 

VOID DrawRectangle(HWND hwnd) 
{ 
    CreateD2DResource(hwnd) ; 

    g_pRenderTarget->BeginDraw() ; 

    // Clear background color to white 
    g_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); 

    D2D1_MATRIX_3X2_F matrix; 
    CalculateTranslationMatrix(&matrix); 
    g_pBlackBrush->SetTransform(&matrix); 

    // Draw Rectangle 
    g_pRenderTarget->DrawRectangle( 
        D2D1::RectF(10.f, 10.f, 50.f, 50.f), 
        g_pBlackBrush 
        ); 

    HRESULT hr = g_pRenderTarget->EndDraw() ; 
    if (FAILED(hr)) 
    { 
        MessageBox(NULL, "Draw failed!", "Error", 0) ; 

        return ; 
    } 
} 
4

1 に答える 1

5

レンダー ターゲット変換を使用して、状態を適用して復元するだけです。たとえば、次のようになります。

  • 描画する前に、g_pRenderTarget->GetTransform を呼び出して、現在の変換のコピーを取得します。
  • 目的のオブジェクト トランスフォームを設定する
  • あなたのオブジェクトを描く
  • 描画前に保存した値を使用して g_pRenderTarget->SetTransform を使用します。
于 2012-09-27T14:03:59.120 に答える