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. rm

    rm [选项]... 目录... 删除指定的<文件>(即解除链接). -d      --directory    删除可能仍有数据的目录 (只限超级用户)-f      --force  ...

  2. 删除GitHub或者GitLab 上的文件夹,git rm -r --ceched 文件夹名 ,提交commit,git push

    方法一 这里以删除 .setting 文件夹为案例 git rm -r --cached .setting #--cached不会把本地的.setting删除 git commit -m 'delet ...

  3. MySQL LIMIT的使用

    SELECT语句返回所有匹配的行,它们可能是指定表中的每个行.为 了返回第一行或前几行,可使用LIMIT子句. 比如我原始的student表如下: 我现在想输出前4行,就使用 SELECT * FRO ...

  4. Qt5鼠标事件及实例

    mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLa ...

  5. QT新建工程编译出现"Moc'ing xxx.h..." 找不到文件或者error MSB6006: "cmd.exe" exited with code 3.

    产生这个问题的原因是QT的头文件路径包含出错: (1)如果没有添加如图所示的路径,则添加后重新编译: (2)如果已经添加了,则删除后,重新添加,在重新编译: (3)或者在QT Project Sett ...

  6. 常用命令-python篇

    1. pip 加速命令 pip install --index-url https://pypi.douban.com/simple pip install -i https://pypi.tuna. ...

  7. Linux awk命令详解 + 练习

    https://www.cnblogs.com/ftl1012/p/9250541.html 练习步骤: 1.我先是在root文件下面创建一个yan.txt文件,然后在文件中随便敲了几个字符串,由空格 ...

  8. centos 7 安装TensorFlow

    查看linux版本 uname -a 查看磁盘大小 准备好python 2.7 查看python版本  import sysprint sys.version print sys.version_in ...

  9. HeadFIrst Ruby 第六章总结 block return values

    前言 这一章通过抽取一个文件中的确定的单词的项目进行讲解,主要包括了: File 的打开.阅读与关闭 find_all & refuse方法的相关内容 map 方法的相关内容这章的核心是:关于 ...

  10. Javascript 第五章总结:A trip to Objectville

    前言 在以前的代码中,我们使用 primitive 类型的变量和 procedural manner 来执行脚本.但是,更好的办法是 object-oriented (面向对象)的.作者说:它能让我们 ...