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