在绘制三角形之前,首先需要创建一个三角形,打开D2DBasicAnimation.h头文件,在D2DBasicAnimation类中添加如下的代码:

private:

    //声明成员变量objectGeometry

    Microsoft::WRL::ComPtr<ID2D1PathGeometry> objectGeometry;

private:

    //创建图形

    void CreateShape();

在上面的代码中,使用private关键字声明一个私有的成员变量objectGeometry和一个私有的CreateShape函数。其中objectGeometry为ID2D1PathGeometry类型的指针,CreateShape函数用来创建一个三角形。

声明了CreateShape函数以后,接着在D2DBasicAnimation.cpp源文件中添加CreateShape函数的实现代码,具体代码如下所示:

void D2DBasicAnimation::CreateShape()

{

    //得到ID2D1PathGeometry类型的对象

    DX::ThrowIfFailed(

        d2dFactory->CreatePathGeometry(&objectGeometry)

    );

    //声明geometrySink指针

    ComPtr<ID2D1GeometrySink> geometrySink;

    DX::ThrowIfFailed(

        objectGeometry->Open(&geometrySink)

    );

    //开始创建图形

    geometrySink->BeginFigure(

        D2D1::Point2F(0.0f, 0.0f),

        D2D1_FIGURE_BEGIN_FILLED

    );

    //设置三角形顶点

    const D2D1_POINT_2F triangle[] = {{100.0f, 100.0f},{100.0f, 300.0f},{200.0f, 200.0f}};

    //使用AddLines函数根据triangle数组创建三角形

    geometrySink->AddLines(triangle, 3);

    //结束图形的创建

    geometrySink->EndFigure(D2D1_FIGURE_END_OPEN);

    geometrySink->Close();

}

在上面的代码中,首先调用d2dFactory指针所指向的对象的CreatePathGeometry函数得到一个ID2D1Geometry类型的对象,使用objectGeometry指针指向此对象。接着声明一个ID2D1GeometrySink类型的指针geometrySink,并以此指针作为参数调用objectGeometry指针所指向的对象的Open函数。调用geometrySink指针所指向的对象的BeginFigure函数开始创建三角形,接着定义一个D2D1_POINT_2F类型的数组triangle来储存三角形的三个顶点,并以此数组作为参数调用geometrySink指针所指向的对象的AddLines函数来创建一个三角形。最后调用geometrySink指针所指向的对象的EndFigure函数和Close函数来结束图形的创建。

创建了一个三角形以后,接下来创建画刷,用于将三角形绘制到应用窗口中。首先在D2DBasicAnimation.h头文件的D2DBasicAnimation类中添加如下的代码,用于声明指针redBrush。

private:

    //redBrush指针

    Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> redBrush;

接下来在D2DBasicAnimation.cpp源文件中添加CreateDeviceResources函数的实现代码,具体实现代码如下所示:

void D2DBasicAnimation::CreateDeviceResources()

{

    //调用DirectXBase类的CreateDeviceResources函数

    DirectXBase::CreateDeviceResources();

    CreateShape();

    //创建红色的画刷

    DX::ThrowIfFailed(

        d2dContext->CreateSolidColorBrush(

            D2D1::ColorF(D2D1::ColorF::Red),

            &redBrush

        )

    );

}

在上面的代码中,首先调用DirectXBase类的CreateDeviceResources函数创建依赖于设备的资源,接着调用CreateShape函数创建三角形,然后调用d2dContext指针所指向的对象的CreateSolidColorBrush函数创建一个红色的画刷对象,并使用redBrush指针指向这个画刷对象。

创建了画刷以后,接下来使用这个画刷来绘制前面创建的三角形。在D2DBasicAnimation.h头文件的D2DBasicAnimation类中添加如下的代码,用来声明Render函数。

private:

    //绘制图形

    void Render();

声明了Render函数以后,接着在D2DBasicAnimation.cpp源文件中添加Render函数的实现代码,具体代码如下所示:

void D2DBasicAnimation::Render()

{

    //调用BeginDraw开始绘图

    d2dContext->BeginDraw();

    //设置应用窗口的背景颜色

    d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Gray));

    //填充图形

    d2dContext->FillGeometry(objectGeometry.Get(), redBrush.Get());

    //结束图形的绘制操作

    d2dContext->EndDraw();

}

在上面的代码中,首先调用d2dContext指针所指向的对象的BeginDraw函数开始绘制图形。以表示灰色的Gray枚举常量作为参数调用ColorF构造函数得到一个ColorF类的对象,接着使用这个ColorF类的对象作为参数调用d2dContext指针所指向的对象的Clear函数将应用窗口的背景设置为灰色。然后调用FillGeometry函数使用红色的画刷填充前面所创建的三角形的内部区域。最后调用d2dContext指针所指向的对象的EndDraw函数结束图形的绘制操作。

添加了Render函数的实现代码以后,接下来在D2DBasicAnimation.h头文件的D2DBasicAnimation类中声明成员变量windowClosed,用于表示应用窗口是否已关闭,代码如下所示:

private:

    //声明成员变量windowClosed

    bool windowClosed;

声明了windowClosed变量以后,接着在D2DBasicAnimation.cpp源文件中添加D2DBasicAnimation构造函数的实现代码,将windowClosed变量赋值为false表示应用窗口未关闭,代码如下所示:

//构造函数D2DBasicAnimation

D2DBasicAnimation::D2DBasicAnimation() :

    windowClosed(false)

{

}

添加了D2DBasicAnimation构造函数的实现代码以后,接着在D2DBasicAnimation.cpp源文件中添加Run函数的实现代码,具体代码如下所示:

void D2DBasicAnimation::Run()

{

    while (!windowClosed)

    {

        //绘制图形

        Render();

        //将最终图像传递给显示器

        Present();

    }

}

在Run方法中,当windowClosed变量为false时,调用Render函数绘制三角形,并调用Present函数将最终图像传递给显示器。

接下来实现上面的Present函数,此函数的实现代码将添加在DirectXBase.cpp源文件中。首先在DirectXBase.h头文件的DirectXBase类中添加如下的代码,用来声明Present函数。

internal:

    //将最终图像传递给显示器

    virtual void Present();

声明了Present函数以后,接下来在DirectXBase.cpp源文件中添加Present函数的实现代码,具体代码如下所示:

// 将最终图像传递给显示器

void DirectXBase::Present()

{

    // 应用程序可以选择指定"已更新"或"滚动"

    // 矩形,以改进特定方案的效率

    DXGI_PRESENT_PARAMETERS parameters = {0};

    parameters.DirtyRectsCount = 0;

    parameters.pDirtyRects = nullptr;

    parameters.pScrollRect = nullptr;

    parameters.pScrollOffset = nullptr;

    //将三角形呈现在应用窗口中

    swapChain->Present1(1, 0, &parameters);

}

在上面的代码中,定义一个DXGI_PRESENT_PARAMETERS结构体的变量parameters,将此结构体变量的成员DirtyRectsCount赋值为0,并将成员pDirtyRects、pScrollRect和pScrollOffset都赋值为nullptr,接着以parameters结构体变量作为参数调用swapChain指针所指向的对象的Present1函数将前面绘制完成的三角形呈现在应用窗口中。

Win10系列:VC++绘制几何图形3的更多相关文章

  1. Win10系列:VC++绘制几何图形2

    新建了Direct2D中的资源后,接下来初始化用于绘制图形的应用窗口.在解决方案资源管理器窗口中右键点击项目图标,在弹出的菜单栏中选中"添加", 并在"添加"的 ...

  2. Win10系列:VC++绘制几何图形1

    本小节主要介绍如何使用Direct2D来绘制几何图形,其中会使用到FillGeometry函数和FillEllipse函数,FillGeometry函数用于填充几何图形的内部区域,而FillEllip ...

  3. Win10系列:VC++绘制几何图形5

    打开D2DBasicAnimation.h头文件,并在D2DBasicAnimation类中添加如下的代码: private:     //声明成员变量point     D2D1_POINT_2F ...

  4. Win10系列:VC++绘制几何图形4

    三角形绘制完成以后,接下来介绍如何给项目添加主入口函数.打开D2DBasicAnimation.h头文件,添加如下的代码定义一个DirectXAppSource类. //定义类DirectXAppSo ...

  5. Cocos2D中使用CCDrawNode绘制几何图形崩溃的解决

    在cocos2D v3.x中已经不能像在v2.x中那样直接调用ccDrawXXX函数来绘制几何图形了. 我们可以使用CCDrawNode或者CCRenderer来绘制图形. 但是官方的Api手册中说的 ...

  6. Win10系列:C#应用控件进阶9

    RectangleGeometry 在使用RectangleGeometry控件绘制矩形时,矩形的位置和尺寸由Rect属性定义,该属性指定矩形的相对位置.高度和宽度.Rect有四个参数,前两个参数表示 ...

  7. Win10系列:C#应用控件进阶6

    路径 路径(Path)可以用来定义任意形状的曲线和几何图形,当然这种任意性也带来了复杂性.为了方便的绘制几何图形,微软在Visual Studio 2012安装包中为程序开发者提供了免费的Blend ...

  8. Win10系列:C#应用控件进阶7

    PathGeometry 前面介绍了Path的使用方法,接下来介绍PathGeometry类.PathGeometry提供了描绘由弧线.曲线和直线组成的多个复杂图形的方法.PathGeometry的核 ...

  9. HTML5绘制几何图形

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

随机推荐

  1. 关于使用python.numpy的tips

    产生含有5个数字的随机向量时,注意写法 import numpy as np A=np.random.randn(5,1)   # 注意不要只写5  B=np.random.randn(5)与A不一样 ...

  2. 算法笔记--斜率优化dp

    斜率优化是单调队列优化的推广 用单调队列维护递增的斜率 参考:https://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 以例1举 ...

  3. Codeforces 939E - Maximize!

    939E - Maximize! 思路: 贪心:最后的集合是最大值+前k小个 因为平均值时关于k的凹形函数,所以可以用三分求最小值 又因为后面的k肯定比前面的k大,所以又可以双指针 三分: #incl ...

  4. Visual Studio 2015+InstallShield 2015

    下载Installshield http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visua ...

  5. 安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消?

    安装xmlspy之后,链接及邮箱等都用这个软件打开,怎样取消? 安装xmlspy之后,大部分的链接就会用这个软件打开,比较糟心.所以尝试很多的方法,终于解决了. (1)打开控制面板,找到默认程序: ( ...

  6. docker 安装完mysql 后客户端无法访问

    1.在虚拟机的centos 中安装 docker 的mysql 镜像. docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12 ...

  7. ADO.NET连接池机制

    为什么需要连接池 剖析一个技术第一个要问的是,这项技术为什么存在. 对于每一个到SQL Server的连接,都需要经历TCP/IP协议的三次握手,身份认证,在SQL Server里建立连接,分配资源等 ...

  8. pandas的时间戳

    pandas时间: p1=pd.Timestamp(2018, 2, 3) p1输出:2018-02-03 00:00:00 p1输出类型:<class 'pandas._libs.tslib. ...

  9. 20170922xlVBA_GetCellTextFromWordDocument

    Sub GetCellTextFromWordDocument() '应用程序设置 Application.ScreenUpdating = False Application.DisplayAler ...

  10. Linux简单了解

    Linux内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和U ...