积分规则 网站地图 帮助中心    
嵌入式软件 单 片 机 DSP 存储器 传感控制 光电显示
嵌入式硬件 CPLD/FPGA SOPC AD/DA 接口电路 模拟设计
I C设计 通信产品 汽车电子 电源产品 消费电子 数控系统
工业控制 军工/航天 安防产品 医疗电子 计算机外设 测试测量
供应 I C
求购 公司库

  IC 求购 销售 公司 论文 DATASHEET 参考设计 论坛
当前位置: 电子技术 >> 嵌入式软件 >> Symbian
  相关分类: LINUX | WINCE | UC/OS | Bootloader | 下载 | VXWORKS | 网络协议 | JAVA | 汇编 | 驱动设计 | Symbian | XP Embedded | Nucleus | 新产品 | 相关文章 | 综合技术 |
Symbian游戏编程入门之图形显示
 
作者:未知   来源:掌控手机游戏门户    点击数:646   更新时间:2007-1-27
您可以添加到网摘 让更多人关注此文章:

    

4.1 Window, Graphics Context和Graphics Device

4.1.1 Window

  在Symbian OS 中,所有的绘图都是在窗口中进行的,窗口是与系统进行交互的基本单位。我们在进行绘图前,首先要声明一个窗口:

  CreateWindowL();

  然后通过SetRect()来设置窗口的大小。

  SetRect(aRect);

  之后我们就可以进行绘图工作了。

4.1.2 Graphics Context

  在Symbian 系统中,所有的绘图工作都是通过Graphics Context完成的。其中包括绘制点、绘制矩形和绘制文本等。所有的Graphics Context都由CGraphicsContent类派生。

  CGraphicsContent类包括的特性有:

  画笔(Pen):表示当前Graphics Context所有要绘制的线的绘图模式,包括颜色、宽度、样式等,可以通过SetPenColor(), SetPenSize(), SetPenStyle()等方法进行设置。

  刷子(Brush):表示当前Graphics Context用以填充的绘图模式,包括填充颜色,样式、背景色等,可通过SetBrushColor(), SetBrushOrigin(), SetBrushStyle(),UseBrushPattern(), DiscardBrushPattern()等方法进行设置。

  字体(Font):表示Graphics Contex当前所使用绘制文本的字体,使用UseFont(),DiscardFont()方法来设置或取消字体。

  位置(Position):表示Graphics Contex的当前位置。可以通过MoveBy(), MoveTo()等方法来改变当前位置。

  原点 (Origin):定义了相对于设备的原点的偏移量,默认值为(0,0),可以通过SetOrigin()来改变。

剪辑(Clipping):定义了需要进行裁切的区域,通过SetClippingRect(),CancelClippingRect()方法进行设置或取消裁切区域。

4.1.3 Graphics Device

  在Symbian系统中,我们通过CGraphicsDevice实现Graphics Device,他指定了我们要操作的具体设备类的接口。

4.2 基本绘图函数的使用

  设置好CGraphicsContent后,我们就可以通过调用相关方法在窗口中绘制图形。

4.2.1文本:

  void DrawText(const TDesC& aText,const TPoint& aPosition)

  void DrawText(const TDesC& aText,const TRect& aBox,TInt aBaselineOffset, TTextAlign aAlignment=ELeft,TInt aLeftMargin=0)

  其中第一个直接在窗口中绘制文本,其中aText给出来要绘制的文本内容,aPosition制定了要绘制文本的起始位置。

  第二个在绘制文本的同时,还要以给定的aBox绘制一个矩形外框。aAlignment参数指定了文本的对齐方向,默认为左对齐;aLeftMargin指定了间隔距离,默认值为0。

  由于Symbian系统的内存受限制,所以,没有使用的字体系统是不会调入内存的,因此我们在绘制文本前,应该首先使用UseFont()设置系统的字体:

  void UseFont(const CFont* aFont)

  这样系统会将字体调入内存中。

  在我们不使用这个字体以后,为了节省内存,要使用DiscardFont()释放掉内存中的字体。

  void DiscardFont()

4.2.2点:

  我们通过Plot()来绘制一个单独的点。点的绘制模式与当前的画笔(Pen)设置相同。void Plot(const TPoint& aPoint)

  当画笔的宽度大于一个像素的时候,系统会以aPoint为圆心,画笔的宽度为直径绘制一个圆,并用画笔的颜色填充这个圆。

4.2.3线:

  绘制直线的方法有DrawLine()、 DrawLineBy()、 DrawLineTo()和DrawPolyLine()、DrawArc(),绘制模式与当前的画笔(Pen)设置相同。

  void DrawLine(const TPoint& aPoint1,const TPoint& aPoint2)

  DrawLine()在aPoint1和aPonit2之间绘制一条直线。

  void DrawLineTo(const TPoint& aPoint)

  DrawLineTo()从当前点向aPoint绘制一条直线。

  void DrawLineBy(const TPoint& aVector)

  DrawLineBy()从当前点向相对当前点位置为aVector的点绘制一条直线。

  void DrawPolyLine(const CArrayFix<TPoint>* aPointList)

  DrawPolyLine()根据给定的位置数组从第一个点开始向第二个点绘制直线,然后以第二个点为起始点向第三个点绘制直线。。。。。。直到最后一个点。

  在这里需要注意的一点是,在绘制直线的时候,系统并不绘制直线的最后一点,如果我们希望绘制一条包括最后一点的直线,我们可以使用上边的Plot()方法绘制最后一个点。

 

4.2.4图形:

  我们可以使用系统提供的方法直接绘制五种简单图形,分别是矩形(rectangle)、圆角矩形(rounded rectangle)、多边形(polygon)、椭圆形(ellipse)和饼型(pie slice)。绘制模式和填充模式与当前的画笔(Pen)、刷子(Brush)设置相同

矩形:

  void DrawRect(const TRect& aRect)

  DrawRect()在屏幕上根据给定的aRect绘制矩形。

圆角矩形:

  void DrawRoundRect(const TRect& aRect,const TSize& aCornerSize)

  DrawRoundRect()在屏幕上根据给定的aRect绘制矩形,并根据给定的aCornerSize确定圆角的直径。

多边形:

  TInt DrawPolygon(const CArrayFix<TPoint>* aPointList,TFillRule aFillRule=EAlternate)

  TInt DrawPolygon(const TPoint* aPointList,TInt aNumPoints,TFillRule aFillRule=EAlternate)

  DrawPolygon()根据给定的点集aPointList按顺序连接并按照aFillRule规则填充多边形。

椭圆形:

  void DrawEllipse(const TRect& aRect)

  DrawEllipse()在给定的aRect区域中绘制椭圆形。如果给定的区域是正方形,那么将绘制出圆形。

饼形:

  void DrawPie(const TRect& aRect,const TPoint& aStart,const TPoint& aEnd)

  DrawPie()通过给定的起始点aStart和结束点aEnd在由aRect形成的椭圆内截取相应的饼型区域。

4.3 Bmp文件的读取和显示

4.3.1读取:

  首先 我们定义要读取的位图所在位置:

_LIT (KMultiBitmapFilename,"\\system\\apps\\graphics\\images.mbm");

  其中images.mdm是我们的位图文件经过压缩打包的结果,是一个多位图文件。我们要在.mmp文件中作如下定义:

START BITMAP      images.mbm

HEADER

TARGETPATH        \system\apps\graphics

SOURCEPATH        ..\bitmaps

SOURCE            c12  image1.bmp

SOURCE            c12  image2.bmp

END

  系统产生一个位图头文件.mbg,这个头文件提供了一个访问位图的ID。例如,在Epoc32\include中的IMAGES.mbg文件包含如下内容:

enum TMbmImages{

      EMbmImagesImage1,

      EMbmImagesImage2,

      };

  接下来我们定义:

CFbsBitmap* iImage1;

CFbsBitmap* iImage2;

  然后我们就可以将mdm中的位图文件读取出来:

iImage1 = new (ELeave) CFbsBitmap();

CleanupStack::PushL(iImage1);

TInt loadException = iImage1 ->Load(KMultiBitmapFilename,EMbmImagesImage1);

User::LeaveIfError(loadException);

CleanupStack::Pop(iImage1);

4.3.2显示:

  通过使用DrawBitmap()方法,可以将已经读取或绘制好的位图显示在窗口中。

  void DrawBitmap(const TPoint& aTopLeft,const CFbsBitmap* aSource)

  这里,aTopLeft指定了要绘制的位图的左上角坐标,aSource给出了要绘制的位图的内容。

  void DrawBitmap(const TRect& aDestRect,const CFbsBitmap* aSource)

  将给出的位图aSource绘制在指定的矩形区域aDestRect中。

  void DrawBitmap(const TRect& aDestRect,const CFbsBitmap* aSource,const TRect& aSourceRect)

  在给出的位图aSource中截取aSourceRect区域,将其内容绘制在指定的矩形区域aDestRect中。

4.4 像素级处理

  可以通过使用TBitmapUtil类的一些方法对位图进行像素级的处理。包括:

void Begin(const TPoint& aPosition):设置当前要处理的像素位置,并锁定堆。

void End():解除对堆的锁定。

void SetPos(const TPoint& aPosition):改变当前像素位置至aPosition。

void IncXPos():将当前的X坐标自增1。

void DecXPos():将当前的X坐标自减1。

void IncYPos():将当前的Y坐标自增1。

void DecYPos():将当前的Y坐标自减1。

TUint32 GetPixel() const:获取当前像素的RGB值。

void SetPixel(TUint32 aValue):设置当前像素的RGB值。

  下面我们通过将一个位图反转后写入另一张位图中的操作来说明TBitmapUtil类的使用方法。

  利用前面已经生成并读取的位图:CFbsBitmap* iImage1和CFbsBitmap* iImage2。这里iImage2的长宽均大于iImage1,我们将iImage1反转装入iImage2中

  首先关联要操作的位图:

TBitmapUtil bitmap1Util(iBitmap1);

TBitmapUtil bitmap2Util(iBitmap2);

  接下来开始对位图操作,并设置初始点为(0,0):

bitmap1Util.Begin(TPoint(0,0));

bitmap2Util.Begin(TPoint(0,0));

  下面从iBitmap1逐像素读取,并写入iBitmap2中:

TSize inSize = iBitmap1->SizeInPixels();

TInt xPos;

for (TInt yPos=0;yPos<inSize.iHeight;yPos++)

{

 bitmap1Util.SetPos(TPoint(0,yPos));

 bitmap2Util.SetPos(TPoint(yPos,0));

 for (xPos=0;xPos<inSize.iWidth;xPos++)

 {

  bitmap2Util.SetPixel(bitmap1Util);

  bitmap1Util.IncXPos();

  bitmap2Util.IncYPos();

 }

  最后结束操作,清理堆栈

bitmap1Util.End();

bitmap2Util.End(); 

  这样,我们就完成了将iImage1反转并写入iImage2中的工作。



相关文章
· 三星同意将Symbian股份出售给诺基亚[145]
· More firms endorse Symbian Foundation[615]
· Symbian操作系统[468]
· Windows C++ 程序员如何过度到Symbian C++ ?[849]
· Symbian内存管理的二十二条军规[676]
热门评论排行
·VHDL设计中电路简化问题的
·ARM嵌入式系统基础教程(N
·江苏嵌入式Linux教育培训
·ARM处理器应用开发4步骤
·锐极LINUX驱动培训班定于

文章评论
    没有任何评论
*只显示最新10条评论。评论内容只代表网友观点,与本站立场无关。更多评论
发表评论
  * 请先[登陆]再进行评论,谢谢。
评分: 1分 2分 3分 4分 5分
内容: *
发帖须知:
一.所发文章必须遵守《互联网电子公告服务管理规定》;
二.严禁发布供求代理信息,公司介绍,产品信息等广告宣传信息;
三.严禁恶意重复发帖;
四.严禁对个人,实体,民族,国家等进行漫骂,污蔑,诽谤。
 
热点新闻 [更多]
 
严冬期如何发展半导体业 扩
2008年中国集成电路市场回顾与展望
分析师:亚洲芯片厂商库存远超预期
2008年基础电子业十大事件点评
Aptina并购智多微手机软件平台设
凌力尔特公司推出用于多核处理器的&n
安森美半导体任命麦满权为韩国及南亚区
Broadcom:半导体产业依然机会
飞思卡尔推i.MX51芯 
日立芯片守卫新年倒数计时晚会
 
热门下载 [更多]
 
[ PCB设计] Protel99教程下载
[ ] 手把手学单片机20个例
[ ] 单片机做的智能台灯
[ ] 单片机入门书
[ ] linux系统移植开发文档
[ ] IC卡的读写程序
[ ] 8051单片机C语言彻底应用
[ 常用软件] 555定时器电路设计软件V1.2
[ 常用软件] 51定时器计算软件
[ ] ARM处理器应用开发4步骤
 
论坛新帖 [更多]
 
低价专业PCB打样 双面板20...
深圳市天漠科技超低价供应atm...
深圳市天漠科技超低价供应ARM...
[推荐]2.5米精度,高灵敏度...
830实验箱+电脑没有并口...
[原创]平望科技助力自服终端国...
低价专业PCB打样 双面板20...
[原创]低价专业PCB打样 双...
Bootloader for ...
【有奖调查】08-09嵌入式开...

 
赞助商 [更多]
 

ICP许可证号:[粤 05056597]
联系电话:010-82517432 82517615 传真: 010-82517615

版权所有 Copyright © 2006 嵌入式技术网