[Symbian]在S60程序中实现动态曲线图
2006-12-27 17:32
323 查看
[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();
}
在该方法中创建定时器,并且启动定时器,程序运行,显示动态曲线图。
[程序运行截图]:
图片发不上去,请读者去相册中观看。
最近在参与设计开发基于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();
}
在该方法中创建定时器,并且启动定时器,程序运行,显示动态曲线图。
[程序运行截图]:
图片发不上去,请读者去相册中观看。
相关文章推荐
- 利用zookeeper实现分布式运用服务器上下线的动态感知-简单程序
- MsChart实现无闪烁动态曲线(MFC)
- C#实现从dll程序集中动态加载窗体
- 程序的链接和装入及Linux下动态链接的实现
- php+javascript实现的动态显示服务器运行程序进度条功能示例
- C#程序实现动态调用DLL的研究
- C#程序实现动态调用非托管的DLL文件
- 程序的链接和装入及Linux下动态链接的实现
- Symbian S60 修改程序图标
- 网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示“××年还剩××天××时××分××秒”
- 【symbian】如何实现程序的前后台运行切换
- JavaWeb之Servlet学习-----实现文件动态下载功能 手写servlet 手动构建web程序
- highcharts 高级应用—动态曲线的实现
- highcharts 高级应用—动态曲线的实现
- C#程序实现动态调用DLL的研究(转载)
- OpenGL动态曲线的实现
- (转)C#程序实现动态调用DLL的研究
- C#程序实现动态调用DLL的研究
- 程序的链接和装入及Linux下动态链接的实现
- SurfaceView 实现动态曲线