在绘制三角形之前,首先需要创建一个三角形,打开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. 串口.Qt532测试(同步)

    环境:Win7x64.Qt5.3.2 MSVC OpenGL(x86).vs2010(x86) ZC:这里的例子是 同步的函数操作,貌似 如果子线程在等待 WaitCommEvent(...)或Rea ...

  2. libxml2的xpath检索中文

    ZC: xmlXPathEvalExpression(...) 当 xpath的字符串中 包含中文的时候,返回NULL,暂时不知道该怎么处理了... ZC: 下面是测试的一些代码/文件,留着以后再研究 ...

  3. R语言barplot双坐标作图

    需要注意的是,设置其中的柱子的宽度,间隔的宽度.有公式如下 width为柱子的宽度 space为间隔宽度 barnumbers 为柱子数量 那么xlim的设置右侧范围为:(width + space) ...

  4. 如何编写一个d.ts文件

    这篇文章主要讲怎么写一个typescript的描述文件(以d.ts结尾的文件名,比如xxx.d.ts). 2018.12.18更新说明: 1.增加了全局声明的原理说明. 2.增加了es6的import ...

  5. (转+整理)C#中动态执行代码

    通过微软提供的CSharpCodeProvider,CompilerParameters,CompilerResults等类,可以在运行时,动态执行自己写的代码文件.原理就是把你的代码文件动态编译成e ...

  6. ubuntu 14.04 postgresql 的总结

    1)为了允许远程连接: a) http://askubuntu.com/questions/423165/remotely-access-postgresql-database To open the ...

  7. English trip V1 - B 21. On a busy day 忙碌的一天 Teacher:Taylor Key: at on in

    In this lesson you will learn to tell the time.  说时间 课上内容(Lesson) at       time; at 7:30; at midday; ...

  8. Aria2 研究(研究资料来自互联网)

    # AriaNg https://github.com/mayswind/AriaNg/releases/tag/1.0.0 http://ariang.mayswind.net/zh_Hans/ # ...

  9. 20181013xlVba据成绩条生成图片文件

    Sub CreateGoalPictures() '声明变量 Dim Wb As Workbook Dim Sht As Worksheet Dim Shp As Shape Dim Pic, End ...

  10. Spring Batch JSON 支持

    Spring Batch 4.1 开始能够支持 JSON 格式了.这个发布介绍了一个新的数据读(item reader)能够读取一个 JSON 资源,这个资源按照下面的格式: [   {     &q ...