zoukankan      html  css  js  c++  java
  • Win10系列:VC++绘制几何图形3

    在绘制三角形之前,首先需要创建一个三角形,打开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函数将前面绘制完成的三角形呈现在应用窗口中。

  • 相关阅读:
    TFS客户端登录用户修改
    MySQL查看最大连接数和修改最大连接数
    LR代理录制方法
    redis desktop manage安装和连接redis
    eclipse内存分析工具MAT
    NMON中的参数指标详解
    LoadRunner设置用户响应时间百分比
    性能测试中关键指标的监控与分析
    内存泄露检查
    tomcat参数设置
  • 原文地址:https://www.cnblogs.com/finehappy/p/6645580.html
Copyright © 2011-2022 走看看