Win10系列:VC++绘制几何图形5
打开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的更多相关文章
- Win10系列:VC++绘制几何图形2
新建了Direct2D中的资源后,接下来初始化用于绘制图形的应用窗口.在解决方案资源管理器窗口中右键点击项目图标,在弹出的菜单栏中选中"添加", 并在"添加"的 ...
- Win10系列:VC++绘制几何图形1
本小节主要介绍如何使用Direct2D来绘制几何图形,其中会使用到FillGeometry函数和FillEllipse函数,FillGeometry函数用于填充几何图形的内部区域,而FillEllip ...
- Win10系列:VC++绘制几何图形4
三角形绘制完成以后,接下来介绍如何给项目添加主入口函数.打开D2DBasicAnimation.h头文件,添加如下的代码定义一个DirectXAppSource类. //定义类DirectXAppSo ...
- Win10系列:VC++绘制几何图形3
在绘制三角形之前,首先需要创建一个三角形,打开D2DBasicAnimation.h头文件,在D2DBasicAnimation类中添加如下的代码: private: //声明成员变量obje ...
- Cocos2D中使用CCDrawNode绘制几何图形崩溃的解决
在cocos2D v3.x中已经不能像在v2.x中那样直接调用ccDrawXXX函数来绘制几何图形了. 我们可以使用CCDrawNode或者CCRenderer来绘制图形. 但是官方的Api手册中说的 ...
- Win10系列:C#应用控件进阶9
RectangleGeometry 在使用RectangleGeometry控件绘制矩形时,矩形的位置和尺寸由Rect属性定义,该属性指定矩形的相对位置.高度和宽度.Rect有四个参数,前两个参数表示 ...
- Win10系列:C#应用控件进阶6
路径 路径(Path)可以用来定义任意形状的曲线和几何图形,当然这种任意性也带来了复杂性.为了方便的绘制几何图形,微软在Visual Studio 2012安装包中为程序开发者提供了免费的Blend ...
- Win10系列:C#应用控件进阶7
PathGeometry 前面介绍了Path的使用方法,接下来介绍PathGeometry类.PathGeometry提供了描绘由弧线.曲线和直线组成的多个复杂图形的方法.PathGeometry的核 ...
- HTML5绘制几何图形
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
随机推荐
- IPC 之 Messenger 的使用
一.概述 Messenger 是一种轻量级的 IPC 方案,它的底层实现是 AIDL ,对 AIDL 进行了封装,方便了对它的使用.Messenger 一次只处理一个请求,所以在服务端不用考虑线程同步 ...
- leecode第十六题(最接近的三数之和)
class Solution { public: void quick_order(vector<int>& num, int star, int en)//快排 { int st ...
- Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...
- MATLAB矩阵操作
- office2016如何激活
office2016如何激活 一.总结 一句话总结:office2016没有激活成功,下了一个office2013破解版 office2013破解版 二.自己做法 三中的方法点赞蛮多的(100多个), ...
- oracle.exe 内存占用过大
现象: 明明各个schema 占用的磁盘空间都不大. oracle.exe 却占用了差不多 3G 的内存. 解决: 查了google,各种英文关键字没有找到原因. 最后,中文检索到了. https:/ ...
- R基本图形示例及代码(持续收集)
分布图 hist(MetaData$genes, breaks = 100, main = "Gene number distribution", xlab = "Gen ...
- BGP - 1,基本概念
1,BGP知识点 a)AS号:私有(64512-65535),公有(0-64511). b)什么时候使用BGP:有数据穿越本AS前往其他AS:本AS有多条到其他AS的连接:必须要做策略. c)BG ...
- LeetCode--404--左叶子之和
问题描述: 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 方法:recursive class ...
- kibana的 timelion工具
时序控件(Timelion)是一款时间序列数据可视化工具,它可以将多种独立的数据源合并呈现到一张视图上. .es函数 index 指明索引 .es(index=nginx-access-log- ...