打开D2DBasicAnimation.h头文件,并在D2DBasicAnimation类中添加如下的代码:

private:

    //声明成员变量point

    D2D1_POINT_2F point;

    //声明成员变量xVector

    float xVector;

    //声明成员变量yVector

    float yVector;

在上面的代码中,使用private关键字声明了三个私有的成员变量point、xVector、yVector,其中point为D2D1_POINT_2F结构体的变量,xVector和yVector为float类型的变量,使用xVector变量表示在X轴上的移动向量,使用yVector变量表示在Y轴上的移动向量。

声明了上述的变量以后,接下来打开D2DBasicAnimation.cpp源文件,在CreateDeviceResources函数中为xVector变量和yVector变量赋初始值。CreateDeviceResources函数的实现代码如下所示:

void D2DBasicAnimation::CreateDeviceResources()

{

    //调用DirectXBase类的CreateDeviceResources函数

    DirectXBase::CreateDeviceResources();

    //为xVector变量和yVector变量赋初值

    xVector=1.0f;

    yVector =1.0f;

    //创建红色的画刷

    DX::ThrowIfFailed(

        d2dContext->CreateSolidColorBrush(

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

            &redBrush

        )

    );

}

上面的代码中调用DirectXBase类的CreateDeviceResources函数,将xVector变量和yVector变量赋值为1.0f,并使用d2dContext指针所指向的对象的CreateSolidColorBrush函数创建一个红色的画刷对象,使用redBrush指针指向这个画刷对象。

添加了上面的代码以后,接下来在D2DBasicAnimation.cpp源文件的Render函数中设置xVector变量值和yVector变量值的变换,实现圆形的移动,Render函数的实现代码如下所示:

void D2DBasicAnimation::Render()

{

    //调用BeginDraw函数开始绘图

    d2dContext->BeginDraw();

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

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

    //定义一个圆形

    D2D1_ELLIPSE ellipse = D2D1::Ellipse(D2D1::Point2F(100.0f, 100.0f), 100.0f, 100.0f);

    //设置point结构体变量的成员x和y的值

    if(2*ellipse.point.x+point.x > window->Bounds.Width)

    {

        xVector=-1.0f;

    }

    else if(point.x<0)

    {

        xVector=1.0f;

    }

    if(2*ellipse.point.y+point.y > window->Bounds.Height)

    {

        yVector =-1.0f;

    }

    else if(point.y<0)

    {

        yVector=1.0f;

    }

    point.x+=xVector;

    point.y+=yVector;

    //得到平移矩阵

    D2D1::Matrix3x2F scale = D2D1::Matrix3x2F::Translation(point.x,point.y);

    d2dContext->SetTransform(scale);

    //绘制圆形

    d2dContext->FillEllipse(&ellipse,redBrush.Get());

    d2dContext->EndDraw();

}

在上面的代码中,首先调用d2dContext指针所指向的对象的BeginDraw函数开始绘制图形,并调用d2dContext指针所指向的对象的Clear函数将应用窗口的背景颜色设置为灰色。然后调用Ellipse函数得到一个D2D1_ELLIPSE结构体的变量ellipse,使用此结构体变量来表示一个圆形。接着设置xVector变量值和yVector变量值的变换,如果圆形碰到屏幕窗口的右边框或底部的边框时将xVector变量的值或yVector变量的值改变为-1.0f,而如果圆形碰到屏幕窗口的左边框或顶部的边框时,则将xVector变量的值或yVector变量的值改变为1.0f,用来避免圆形移动出屏幕窗口。接下来将point结构体变量的成员x加上xVector变量赋值给此结构体变量的成员x,并将point结构体变量的成员y加上yVector变量赋值给此结构体变量的成员y。

接下来以point结构体变量的成员x和y作为参数调用Matrix3x2F类的Translation函数得到一个Matrix3x2F类的对象,并赋值给scale变量,接着以此变量作为参数调用d2dContext指针所指向的对象的SetTransform函数,从而改变红色圆形中点的坐标。然后调用d2dContext指针所指向的对象的FillEllipse函数使用redBrush指针指向的画刷对象填充ellipse结构体变量所定义的圆形区域。最后调用d2dContext指针所指向的对象的EndDraw函数结束图形的绘制操作。

运行Direct2DDemo项目后,原本静止的圆形将会在应用窗口中移动。

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

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

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

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

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

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

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

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

    在绘制三角形之前,首先需要创建一个三角形,打开D2DBasicAnimation.h头文件,在D2DBasicAnimation类中添加如下的代码: private:     //声明成员变量obje ...

  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. IPC 之 Messenger 的使用

    一.概述 Messenger 是一种轻量级的 IPC 方案,它的底层实现是 AIDL ,对 AIDL 进行了封装,方便了对它的使用.Messenger 一次只处理一个请求,所以在服务端不用考虑线程同步 ...

  2. leecode第十六题(最接近的三数之和)

    class Solution { public: void quick_order(vector<int>& num, int star, int en)//快排 { int st ...

  3. Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...

  4. MATLAB矩阵操作

  5. office2016如何激活

    office2016如何激活 一.总结 一句话总结:office2016没有激活成功,下了一个office2013破解版 office2013破解版 二.自己做法 三中的方法点赞蛮多的(100多个), ...

  6. oracle.exe 内存占用过大

    现象: 明明各个schema 占用的磁盘空间都不大. oracle.exe 却占用了差不多 3G 的内存. 解决: 查了google,各种英文关键字没有找到原因. 最后,中文检索到了. https:/ ...

  7. R基本图形示例及代码(持续收集)

    分布图 hist(MetaData$genes, breaks = 100, main = "Gene number distribution", xlab = "Gen ...

  8. BGP - 1,基本概念

    1,BGP知识点 a)AS号:私有(64512-65535),公有(0-64511). b)什么时候使用BGP:有数据穿越本AS前往其他AS:本AS有多条到其他AS的连接:必须要做策略.   c)BG ...

  9. LeetCode--404--左叶子之和

    问题描述: 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 方法:recursive class ...

  10. kibana的 timelion工具

    时序控件(Timelion)是一款时间序列数据可视化工具,它可以将多种独立的数据源合并呈现到一张视图上. .es函数 index 指明索引    .es(index=nginx-access-log- ...