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绘制的文本

Win10系列:VC++绘制文本的更多相关文章

  1. 使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容

    原文:使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容 第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也 ...

  2. html5 canvas 笔记三(绘制文本和图片)

    绘制文本 fillText(text, x, y [, maxWidth])   在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的. strokeText(text, x, y [, ma ...

  3. FontMetrics ----- 绘制文本,获取文本高度

    Canvas 绘制文本时,使用FontMetrics对象,计算位置的坐标. public static class FontMetrics { /** * The maximum distance a ...

  4. Quartz2D 之 绘制文本

    1. 基础概念 1.1. 字体(Font) 同一大小.同一样式的字形的集合. 1.2. 字符(Character) 字符表示信息本身,一般指某种编码,如Unicode编码. 1.3. 字形(Glyph ...

  5. 使用GDI绘制文本

    /// <summary>        /// 定义一个绘制文本        /// </summary>        public void Texts()       ...

  6. 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制

    背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...

  7. Javascript高级编程学习笔记(88)—— Canvas(5)绘制文本

    绘制文本 同样的,canvas也为绘制文本提供了相应的方法. 2D上下文提供的文本绘制方法主要有两个: fillText() strokeText() 这两个方法都接受四个参数 要绘制的文本字符串 绘 ...

  8. Win32汇编学习(5):绘制文本2

    这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...

  9. Win32汇编学习(4):绘制文本

    这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...

随机推荐

  1. STL_string.vector中find到的iterator的序号

    ZC:注意,printf("0x%08X\n",vtr.end()); 打印出来 应该就是 0x00000000,∵ 它就是 指向最后一个元素的后面,应该是理解成 无意义      ...

  2. linq to sql and linq to object 总结

    Enumable类型是linq to object   是一个很特殊的类型   这个类型的数据源都是在程序的内存中 Queryable类型是 Linq to sql   对数据库进行操作都是这个类型  ...

  3. git批量删除文件和批量提交

    1. 单个删除文件: ① 通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:(可选操作,可直接执行②删除) $ rm test.txt ② 确实要从版本库中删除该文件,那就用命令git rm ...

  4. cocos2dx AudioEngine在Android7上播放音效卡顿问题处理

    1.此问题在cocos2dx 3.13/3.14版本(其它版本没有测试过)在Android7中使用AudioEngine的play2d函数播放音效时出现. 调试时出现如下提示: 2.论坛中相关讨论帖地 ...

  5. Android接入微信SDK之一:发起微信授权登录

    1.重要的事情首先说! 包名.应用签名.app id 三者都必须和在腾讯上申请的一致!!!否则将不能成功. 包名:就是在腾讯上申请的包名 应用签名:使用微信官网提供的<签名生成工具>(这个 ...

  6. DirectX之顶点法线的计算

    首先要明白,顶点法线存在的原因:确定灯光照射到物体表面的角度.所以一提到顶点法线,肯定要进行与灯光相关的运算了. 下面是顶点法线的计算方式 假如 A.B.C三个顶点构成一个三角形,它们对应的顶点法线分 ...

  7. 响应式图片 (responsive image)

    更新 : 2019-02-21 除了写 srcset sizes 还有一种 x1, x2, x3, x4 的写法. 我们对比一下 假设 pc 希望是 1000w mobile 希望是 300w siz ...

  8. Can't push you anymore...

    为什么我们不趁着年轻去冒险? 等我们准备好,也许都已经被生活冲淡了激情. Go to different places,to meet different people. To try, to fin ...

  9. Polygenic score

    We estimate the maximum prediction accuracy for the risk of Alzheimer's disease based on disease pre ...

  10. 扩大了一个逻辑卷,resize2fs 保错:没有这个超级块

    检查发现,文件系统类型是xfs,应该使用 xfs_growfs命令刷新文件系统