我在同一个渲染目标上有几个 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 ;
}
}