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. python模块(3)

    1.xml:实现不同语言或程序之间进行数据交换的协议 <data> <country name="Liechtenstein"> <rank upda ...

  2. 00-python-内置函数笔记

    01.enumerate()函数用于将一个可遍历的数据对象(如 列表.元组或字符串)组合为一个索引序列,同时列出数据和数据包下标,一般用在for循环中 for i, element in enumer ...

  3. Getting started with Processing 示例11-9 追随鼠标移动

    程序片段 int num = 60; int[] x = new int[num]; int[] y = new int[num]; void setup(){ size(240,120); noSt ...

  4. 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形菜单拖放控制

    jQuery EasyUI 树形菜单 - 树形菜单拖放控制 当在一个应用中使用树(Tree)插件,拖拽(drag)和放置(drop)功能要求允许用户改变节点位置.启用拖拽(drag)和放置(drop) ...

  5. wpf 使用DocumentViewer打印

    https://blog.csdn.net/duanzi_peng/article/details/14118937?locationNum=15 https://www.cnblogs.com/zl ...

  6. LeetCode--011--盛最多水的容器(java)

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  7. LeetCode--455--分发饼干

    问题描述: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j , ...

  8. android AIDL 语言用法

    跨进程通信可以用AIDL语言 这里讲述下如何使用AIDL语言进行跨进程通信 文章参考 <设计模式>一书 demo结构参考 主要的文件类有:IBankAidl.aidl java文件:Aid ...

  9. python3—列表

    列表是什么 name = ["jim", "lilei", "lucy"] #方括号表示,逗号分隔 print(name) print(na ...

  10. js删除数组中元素的方法

    一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...