[Symbian]在S60程序中实现动态曲线图

[Symbian]在S60程序中实现动态曲线图

最近在参与设计开发基于S60平台的智能终端防火墙项目,项目中有一个Feature,需要在防火墙程序的状态页显示实时的无线网络流量曲线图,由我负责该Feature。现把设计方案和源代码共享出来,希望能够帮助有同样需求的朋友。
   [说明]:
       为了尽量简化程序,样例代码中使用了随机数来模拟实时网络流量,主要讲解动态曲线图的实现
原理。读者可以根据需要把随机数替换成内存使用量,CPU利用率,网络流量等一些实时变化的数据。
   [实现原理]:
       其实也很简单,就是利用定时器,每隔一段时间(1秒,10毫秒等)获取一次动态数据,然后把获取
的动态数据按照某种自定义的格式转换成设备屏幕坐标,作为一个点绘制到屏幕上,最后把所有的点两两连线连接起来,就得到了动态曲线图效果。
   [动态数据和设备屏幕坐标的转换]:
       动态数据乘以一个转换系数作为点的纵坐标,点的横坐标要随着定时器进行及时地更新(加上/减
去一个定值),这样才能使曲线动态地向左/右移动。
   [代码解析]:
       项目在Carbide中建立,采用基于传统控件的GUI框架(也可以使用基于Avkon转换视图的GUI框架)
,主要代码在XXXContainer类(采用基于Avkon转换视图的GUI框架的话,代码在XXXView类)中。在该类中增加两个主要的成员变量:
         //点数组,大小默认100,存放每次获取的动态数据转换成的屏幕点
         RPointerArray<TPoint> iPointSet;
         CPeriodic* iPeriodicTimer;//定时器
      添加的新的方法:
       1.与定时器相关的方法:
         void StartTimer();
         static TInt Period( TAny* aPtr);
         void DoPeriodTask();      
       这部分方法都跟定时器相关,代码也是固定化的,不懂定时器怎么使用的读者,可以参考SDK帮助
文档。
       2.获取随机数
       TInt GetRandY(TInt MaxY);

       3.更新屏幕上曲线的方法       

void CLineContainer::UpdateDisplay() const
    {
        
        CWindowGc
& gc =  SystemGc();
        gc.Clear();
        
//绘制屏幕背景为黑色

        gc.SetPenStyle( CGraphicsContext::ENullPen );
        gc.SetBrushColor( KRgbBlack );
        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
        TRect rect 
=
 Rect();
        gc.DrawRect(rect);
        
//绘制网格线,颜色为绿色

        TSize PenSize(1,1 );
        gc.SetPenSize(PenSize);
        gc.SetPenColor(KRgbGreen);
        gc.SetPenStyle(CGraphicsContext::ESolidPen);
        TInt RowCount 
= rect.iBr.iY / KRowWidth + 1
;
        TInt ColCount 
= rect.iBr.iX / KColWidth + 1
;
        
//画横线

        for(TInt count = 0; count < RowCount; count++ )
        {
            TPoint p1(
0,count*
KRowWidth);
            TPoint p2(rect.iBr.iX,count
*
KRowWidth);
            gc.DrawLine(p1,p2);
        }
        
//画竖线

        for(TInt count = 0; count < ColCount; count++ )
        {
            TPoint p1(count
*KColWidth,0
);
            TPoint p2(count
*
KColWidth,rect.iBr.iY);
            gc.DrawLine(p1,p2);
        }
        
//绘制曲线,把所有点两两连线连接起来

        gc.SetPenColor(KRgbYellow);
        
for(TInt count=0;count < iPointSet.Count()-1;count++
)
        {
            gc.DrawLine(
*iPointSet[count],*iPointSet[count+1
]);
        }
    }

     
    
需要修改的方法:
       1.Draw方法

void CLineContainer::Draw(const TRect& aRect) const
    {
         ... ...
        UpdateDisplay();
    }

      2.ConstructL方法

void CLineContainer::ConstructL(const TRect&  aRect)
    {
    CreateWindowL();
    
    
    
// Create a periodic timer but don't start it yet

    iPeriodicTimer =  CPeriodic::NewL( CActive::EPriorityStandard );
    SetRect(aRect);
    ActivateL();

    
//启动定时器

    StartTimer();
    }

  在该方法中创建定时器,并且启动定时器,程序运行,显示动态曲线图。

   [程序运行截图]:

    图片发不上去,请读者去相册中观看  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值