zoukankan      html  css  js  c++  java
  • Win10系列:VC++绘制文本

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

  • 相关阅读:
    远程管理登录Linux
    Linux常用命令之文件搜索命令
    PowerPoint笔记(七)
    PowerPoint笔记(六)
    C Primer Plus(四)
    Linux常用命令之文件处理命令
    Linux常用命令之权限管理命令
    C Primer Plus(五)
    C Primer Plus(六)
    C Primer Plus(三)
  • 原文地址:https://www.cnblogs.com/finehappy/p/6645622.html
Copyright © 2011-2022 走看看