20.7.2小节介绍了如何使用Direct2D在应用窗口中绘制图片,本小节将基于20.7.2小节的项目进一步介绍如何实现文本的绘制。打开D2DBasicAnimation.h头文件,并在D2DBasicAnimation类中添加如下的代码:
private:
//声明成员变量textLayout
Microsoft::WRL::ComPtr<IDWriteTextLayout> textLayout;
//声明成员变量textFormat
Microsoft::WRL::ComPtr<IDWriteTextFormat> textFormat;
//声明成员变量whiteBrush
Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> whiteBrush;
private:
//创建文本
void CreateText();
在上面的代码中,使用private关键字声明三个私有的成员变量,分别为textLayout、textFormat和whiteBrush,其中textLayout为IDWriteTextLayout类型的指针,textFormat为IDWriteTextFormat类型的指针,whiteBrush为ID2D1SolidColorBrush类型的指针。然后使用private关键字声明一个私有的函数CreateText,用于创建文本。
声明了CreateText函数以后,接着打开D2DBasicAnimation.cpp源文件,并添加CreateText函数的实现代码,具体代码如下所示:
void D2DBasicAnimation::CreateText()
{
//声明nameTextFormat指针
ComPtr<IDWriteTextFormat> nameTextFormat;
//得到IDWriteTextFormat类型的对象
DX::ThrowIfFailed(
dwriteFactory->CreateTextFormat(
L"宋体",
nullptr,
DWRITE_FONT_WEIGHT_LIGHT,
DWRITE_FONT_STYLE_NORMAL,
DWRITE_FONT_STRETCH_NORMAL,
36.0f,
L"zh-CN",
&nameTextFormat
)
);
//设置文本横向对齐方式
DX::ThrowIfFailed(nameTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING)
);
//设置文本纵向对齐方式
DX::ThrowIfFailed(nameTextFormat->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR)
);
//所要绘制的文本
Platform::String^ textString="我的Direct2D应用";
//得到IDWriteTextLayout类型的对象
DX::ThrowIfFailed(
dwriteFactory->CreateTextLayout(
textString->Data(),
textString->Length(),
nameTextFormat.Get(),
4096.0f,
4096.0f,
&textLayout
)
);
}
在上面的代码中,首先声明一个IDWriteTextFormat类型的指针nameTextFormat。接着调用dwriteFactory指针所指向的对象的CreateTextFormat函数,将文本中字体的类型、粗细、样式、拉伸格式和大小分别设置为"宋体"、DWRITE_FONT_WEIGHT_LIGHT、DWRITE_FONT_STYLE_NORMAL、DWRITE_FONT_STRETCH_NORMAL和36.0f,语言设置为"zh-CN",并得到一个IDWriteTextFormat类型的对象,使用nameTextFormat指针指向这个IDWriteTextFormat类型的对象。
接下来调用nameTextFormat指针所指向的对象的SetTextAlignment函数设置文本横向的对齐方式为与文本框前端对齐,并调用nameTextFormat指针所指向的对象的SetParagraphAlignment函数设置文本的纵向对齐方式为与文本框顶端边缘对齐。然后将所要绘制的文本内容赋值给一个String类型的变量textString,通过此变量的Data函数和Length函数分别得到一个指向textString变量的指针和此变量的大小。接着以指向textString对象的指针和textString对象的大小作为参数调用dwriteFactory指针所指向的对象的CreateTextLayout函数得到一个IDWriteTextLayout类型的对象,使用textLayout指针指向这个对象。
实现了CreateText函数以后,接下来创建一个白色的画刷对象,用来绘制文本。在D2DBasicAnimation.cpp源文件中添加CreateDeviceResources函数的实现代码,具体代码如下所示:
void D2DBasicAnimation::CreateDeviceResources()
{
//调用DirectXBase类的CreateDeviceResources函数
DirectXBase::CreateDeviceResources();
//创建文本
CreateText();
//创建白色的画刷对象
DX::ThrowIfFailed(
d2dContext->CreateSolidColorBrush(ColorF(ColorF::White), &whiteBrush)
);
}
上面的代码使用DirectXBase类的CreateDeviceResources函数创建Direct2D中依赖于设备的资源,然后调用CreateText函数来创建文本,接着通过d2dContext指针所指向的对象的CreateSolidColorBrush函数创建一个白色的画刷对象,并使用whiteBrush指针指向这个对象。
创建了白色的画刷对象以后,接下来在D2DBasicAnimation.cpp源文件的Render函数中实现文本的绘制,具体代码如下所示:
void D2DBasicAnimation::Render()
{
//调用BeginDraw函数开始绘图
d2dContext->BeginDraw();
//设置应用窗口的背景颜色
d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Gray));
//绘制文本
d2dContext->DrawTextLayout(
Point2F(100.0f,100.0f),
textLayout.Get(),
whiteBrush.Get()
);
d2dContext->EndDraw();
}
在上面的代码中,首先调用d2dContext指针所指向的对象的BeginDraw函数开始绘制图形,接着通过d2dContext指针所指向的对象的Clear函数将应用窗口的背景颜色设置为灰色。然后使用d2dContext指针所指向的对象的DrawTextLayout函数来绘制文本,其中DrawTextLayout函数的第一个参数是文本区域的左上角坐标,这里设置为{100.0f,100.0f }。最后调用d2dContext指针所指向的对象的EndDraw函数结束文本的绘制操作。
运行Direct2DDemo项目后,将在应用窗口中绘制如图20-19所示的文本。
图20-19 Direct2D绘制的文本