Как преобразовать один из текстовых объектов DirectWrite, не изменяя остальные

У меня есть несколько текстовых объектов 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 ; 
    } 
} 

person zdd    schedule 21.09.2012    source источник


Ответы (1)


Вы можете использовать преобразование цели рендеринга и просто применять и восстанавливать состояния, например:

  • Перед отрисовкой вызовите g_pRenderTarget->GetTransform, чтобы получить копию текущего преобразования.
  • Установите желаемое преобразование объекта
  • Нарисуйте свой объект
  • используйте g_pRenderTarget->SetTransform, используя значение, которое вы сохранили до рисования.
person mrvux    schedule 27.09.2012
comment
Это работает, спасибо! на самом деле, я делал то же самое в D3D, но я забыл об этом, когда изучал D2D, спасибо :) - person zdd; 28.09.2012