用Direct2D和DWM来做简单的动画效果2

30 篇文章 4 订阅
7 篇文章 0 订阅

在上一篇文章用Direct2D和DWM来做简单的动画效果
里写了很简单的一个例子,这个例子是MS官方的例子,那么这篇根据官方的思路自己修改修改

效果

做了绕圆盘旋转的指针样的动画,从圆心指向圆弧。见图
这里写图片描述

核心流程

总结下MS这个例子核心-由DWM计算实时路径位置部分的流程
这里写图片描述
其中,
A部分由Animation类的派生类设定,即SetStart(),SetEnd(),SetDuration()
B部分由ComputeValue函数计算得到,注意这个函数输入时间有DWM给出,
C部分由ComputePointAtLength函数的第三个输入计算得到。

本例流程

a.初始化D2D相关类,初始化DWM对象
b.构造D2D绘图路径对象,即那个时钟的圆弧
c.按照DWM返回值刷新绘图对象的位置
d.构造D2D绘图动态对象,即根据c计算的位置,实时画出指针

部分代码

/*****Render()里省略与上例相同代码********
//画圆弧
        pSink->BeginFigure(D2D1::Point2F(250, 255),     D2D1_FIGURE_BEGIN_FILLED
            );

        pSink->AddArc(
            D2D1::ArcSegment(
                D2D1::Point2F(500, 255), // end point
                D2D1::SizeF(85, 85),
                0.0f, // rotation angle
                D2D1_SWEEP_DIRECTION_CLOCKWISE,
                D2D1_ARC_SIZE_SMALL
                ));
        pSink->AddArc(
            D2D1::ArcSegment(
                D2D1::Point2F(250, 255), // end point
                D2D1::SizeF(85, 85),
                0.0f, // rotation angle
                D2D1_SWEEP_DIRECTION_CLOCKWISE,
                D2D1_ARC_SIZE_SMALL
                ));

*********
//实时画箭头
DrawArrow(D2D1::Point2F(375, 255), point);

void CD2D::DrawArrow(D2D1_POINT_2F ptbase, D2D1_POINT_2F ptend)
{
    double slopy, cosy, siny;
    double length; //length of Arrow 
    length = 0.3 * sqrt((ptbase.y - ptend.y)*(ptbase.y - ptend.y)
        + (ptbase.x - ptend.x)*(ptbase.x - ptend.x));
    slopy = atan2((ptbase.y - ptend.y), (ptbase.x - ptend.x));
    cosy = cos(slopy);
    siny = sin(slopy);
    D2D1_POINT_2F p[3];
    D2D1_POINT_2F start;
    start.x = ptbase.x;
    start.y = ptbase.y;

    p[0].x = ptend.x;
    p[0].y = ptend.y;

    p[1].x = ptend.x + length * cosy - (length / 2.0 * siny);
    p[1].y = ptend.y + length * siny + (length / 2.0 * cosy);

    p[2].x = ptend.x + length * cosy + length / 2.0 * siny;
    p[2].y = ptend.y - length / 2.0 * cosy + length * siny;

    m_pRT->DrawLine(ptbase, ptend, m_pYellowBrush);
    m_pRT->DrawLine(p[0], p[1], m_pYellowBrush);
    m_pRT->DrawLine(p[0], p[2], m_pYellowBrush);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值