0

我在同一个渲染目标上有几个 DirectWrite 文本对象,我想一次转换其中一个对象,同时保持其他对象不变,在 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 回答