Symbian 图形编程入门

news/2024/10/25 17:14:13/

一 Symbian OS简介

 

1.1 Symbian操作系统的起源和现状

 

Symbian成立于1998年,由爱立信、诺基亚、摩托罗拉和Psion共同出资筹建。1999年,松下公司加入Symbian。2000年,世界上第一款采用Symbian操作系统的手机Ericsson R380成功上市,同年,索尼公司和三洋公司获得了Symbian 的授权。 2001年, 富士通公司获得了Symbian的授权。诺基亚公司推出了Nokia 7650-基于 Symbian操作系统的2.5G手机. 同时,Nokia 9210开始公开发售。

 

2002年,西门子公司与索尼-爱立信公司入股Symbian,Sendo公司获得了Symbian的授权。NTT DoCoMo 发布3G FOMA F2051手机。 Symbian发布第一个用于3G系统的手机操作系统Symbian OS v7.0 for 3G mobile phones。2003年,诺基亚成功推出了第一款基于Symbian OS v7.0s的手机。同年,三星公司成为Symbian的股东之一。

 

2004年,已经发布的采用Symbian OS 的手机包括Panasonic X700, Motorola A1000, Nokia 9500, 7610 和N-Gage QD, Samsung SGH-D710。Arima公司与LG电子获得了Symbian的授权。同时,联想公司决定将Symbian操作系统用于他们最近的手机产品中。

 

  而Symbian随着手机的发展得到了越来越多的市场。在目前手机操作系统的争夺中,Symbian市场占有率达到了70%,是当之无愧的老大,而微软的windows mobile和其他操作系统一共只有30%的份额。

 

  目前,全球主流手机操作系统争夺主要有三种:

 

   1.Symbian操作系统:按持股比例多少,由诺基亚、爱立信、索尼爱立信、松下、三星、西门子共6家厂商顺序组成的Symbian联盟把持。优点是价格适中,对手机要求较低,缺点是开发人员少。

 

   2.windows mobile操作系统:优点在于可以方便地和PC上的windows进行互通,开发人员多,但缺点是授权费最高,对手机要求也高。

 

   3.Linux:全球开放的系统,任何厂家和开发商均可使用,优点是价格最低,对手机要求最低,缺点也很明显,厂家各自为营,手机之间的互通性差。

 

1.2 Symbian操作系统使用的手机设备

 

 

采用Symbian操作系统的智能手机已经推出的包括以下几款:Sony Ericsson P910,Sony Ericsson P900,Sony Ericsson P800, FOMA F900i,FOMA F2051, Nokia 6600,Nokia N-Gage,Nokia 7610,Nokia N-Gage QD,Nokia 3660/3620,FOMA F2102V, Nokia 7650,Nokia 3650/3600,Nokia 9290 Communicator,Nokia 9210 Communicators,Sendo X,Motorola A920,Motorola A925,Siemens SX1。

 

即将推出的还有:Arima U300 ,Nokia 6670,Nokia 6630 ,Nokia 6260 ,Nokia 9500,Nokia 9300,Nokia 6620,BenQ P30,Samsung SGH-D710,Panasonic X700,Motorola A1000,,FOMA F900iT  FOMA F880iES,FOMA F900iC。

 

 

1.3 Symbian OS的特点

 

Symbian OS具有以下6大特点: 

1、操作系统是运行在ROM上的

 

2、系统是运行在电池驱动的设备上的

 

3、完全是面向对象的

 

4、基于组件的设计

 

5、被设计成确保用户的数据不会丢失

 

6、简单的UI系统

 

Symbian 是真正的微核操作系统,所谓“微核”,就是说操作系统 只有很小的一部分是运行在最高优先级的,其他的功能都是以Client-Server的方式提供。下面是Symbian系统的内部结构图:

 

应用层:

 

Shell, OPL, 及其他应用程序

 

=================================================================

 

系统层:

 

Dialogs, Menu, Toolbar, Icons, Resources, JavaVM, Grid, Rich Text,  Edit Control,  List Control, Application Framework, Jave Class Libraries. =================================================================

 

服务层:

 

Window Server, Process Server, Socket Server, Sound Server, Wireless Server, Database Server, File Server, Alarm Server, Comms Server, 以及无线协议

 

=================================================================

 

内核:

 

euser.dll, ekern.exe, 服务控制(supervisor server), HAL(设备抽象层)

 

=================================================================

 

驱动程序层:

 

包括音频驱动,显示驱动,MMC驱动,键盘驱动,串并口驱动 ,DSP驱动,时钟控制器驱动等等

 

二.开发环境入门

 

2.1 安装SDK及VC

 

Nokia根据手机的屏幕大小和价格高低把手机分成了多个系列,现在使用的系列有:Series 40、Series 60、Series 80 和Series 90。60系列采用Symbian os 6.1,然后又根据手机屏幕的特点对UI做了一些修改,这个被修改了的Symbian就被称为Nokia的60系列平台。使用60系列的手机型号包括:Nokia 6670、 Nokia 6630、 Nokia 6260 、Nokia N-Gage QD™ 、Nokia 7610 、Nokia 6620 、Nokia 3620 、Nokia 3660 、Nokia 6600 、Nokia 3600、Nokia 3650、Nokia 7650、Nokia N-Gage™等。

 

下面我们就以60系列为例,介绍SDK的安装过程。

 

2.1.1 安装SDK

 

第一步,到Nokia论坛注册,下载最新的SDK。Nokia 网站提供的Series 60 SDK for Symbian OS Nokia Edition SDK最新版本是v1.2,Series 60 SDK for Symbian OS的最新版本是v2.1。下载网址:http://www.forum.nokia.com/main/0,6566,034-4,00.html

 

第二步,到http://www.activestate.com 网站下载最新的Active Perl Script 安装程序。到http://www.java.com/en/download/manual.jsp 下载最新的J2RE。

 

第三步:安装SDK,推荐为Symbian开发单独建一个目录,例如d:/Symbian而不是使用C:/program files等这样的目录。

 

第四步:安装Active Perl和J2RE,安装到默认目录即可。

 

第五步:检查环境变量设定。打开系统环境变量tab,然后看看有没有EPOCROOT,如果有的话,把它手动改成“/” 。改完之后应该是这个样子的:

 

EPOCROOT = /

 

然后,在系统PATH中加入 /epoc32/tools目录以及/epoc32/gcc/bin目录就可以了。

 

实际上,Symbian SDK根本不用安装,直接把epoc32目录拷贝到一个机器上,然后照上述方法设定目录和环境变量就可以了。

 

2.1.2 配置VC

 

如果我们使用的是VC 6.0,我们要保证系统至少打了SP3补丁,否则系统会有警告提示。如果我们使用的是VS.NET2003, 我们就只能安装Series 60 SDK for Symbian OS v2.1,因为Series 60 SDK for Symbian OS Nokia Edition SDK v1.2在VS.NET2003无法正确建立工程。

 

如果要直接在vc6里创建新项目,要把/Symbian/6.1/Series60/Series60Tools/ Application Wizard目录下的 AvkonAppWiz.awx和AVKONAPPWIZ.HLP文件拷贝到vc6的模板目录C:/Program Files/ Microsoft Visual Studio/ Common/ MSDev98/ Template下。这样我们就可以在VC的新建工程中看到Series 60 AppWizard v 1.9这个选项.

 

    填入Project Name 以后,确认。

 

一路“Next”,一个最简单的Symbian应用程序就建立好了。

 

如果要将已经建立好的工程导入到VC6.0中,比如我们将SDK中的例子HelloWorld转换成一个VC6的项目,我们首先进入/Symbian/6.1/Series60/Series60Ex/HelloWorld目录。在这里我们可以看到,在Symbian中,一个Project通常是按inc, src, group等目录组织,group目录里通常放的是项目文件,所以编译时要先到这里。用命令提示符模式进入刚才说的那个目录下,然后执行:

 

bldmake bldfiles

 

这个命令会在group目录下生成一个abld.bat的批处理文件,并且会在/Symbian /6.1/Series60/Epoc32/BUILD下生成/Symbian/6.1/Series60/Epoc32/BUILD/SYMBIAN/6.1/ SERIES60/SERIES60EX/HELLOWORLD/GROUP这个目录,并在最底层目录下生成一堆 .make文件。

 

然后,我们在同一个目录运行刚才生成的abld.bat:

 

abld makefile vc6

 

这样就会自动生成vc6的dsw文件,位置在/Symbian/6.1/Series60/Epoc32/BUILD/ SYMBIAN/6.1/ SERIES60/SERIES60EX/HELLOWORLD/GROUP/HELLOWORLD/WINS。然后我们就可以在VC6种打开这个Symbian工程了。

 

2.2 编译

 

我们可以直接使用SDK提供的工具编译Symbian 工程,也可以使用VC6提供的集成环境来编译转化过的Symbian 工程。编译的结果存放在/Symbian/6.1/Series60/Epoc32/ Release/wins/UDEB/Z/SYSTEM/apps目录中。

2.2.1使用SDK提供的工具编译Symbian 工程

 

我们在上一节的那个位置继续输入:

 

abld build wins udeb

 

这个命令会编译我们的程序,最后在/Symbian/6.1/Series60/Epoc32/Release/wins/UDEB目录下生成我们的helloworld,然后我们可以从开始菜单里运行模拟器的debug版,在模拟其中就可以运行helloworld了。

2.2.2 使用VC6编译Symbian 工程

 

我们直接打开运行abld makefile vc6后生成的dsw文件,VC自动装载转化过的工程。按F7便可以直接编译工程,编译结果同样放在/Symbian/6.1/Series60/Epoc32/Release/ wins/UDEB目录中。然后我们打开模拟器debug 版,就可以看到我们编译好的工程了。

 

 

 

 

2.3 打包

 

我们以SDK 1.2提供的HelloWorld为例,制作可以在手机中安装的.SIS文件:

 

2.3.1.检查程序

 

首先,在命令行格式下,进入HelloWorld工程mmp文件所在目录,输入bldmake bldfiles和abld build wins udeb,然后打开模拟器,检测程序有无错误。

 

2.3.2.编译工程

 

在程序无错误后,在命令行输入abld build armi urel 。执行这个命令之后会在目录d:/symbian/6.1/series60/epoc32/release/armi/urel生成HELLOWORLD.APP和HELLOWORLD.RSC两个文件。

 

2.3.3.建立.pkg文件

 

在d:/Symbian/6.1/Series60/Series60Ex/helloworld/sis  用记事本建立或者修改工程的pkg文件,内容如下:

 

; HelloWorld.pkg

 

;

 

;Language - standard language definitions

 

&EN

 

 

 

; standard SIS file header

 

#{"HelloWorld"},(0x10005B91),1,0,0

 

 

 

;Supports Series 60 v 1.2

 

(0x101F8202), 0, 0, 0, {"Series60ProductID"}

 

;

 

"d:/symbian/6.1/series60/epoc32/release/armi/urel/HelloWorld.APP"-"!:/system/apps/HelloWorld/HelloWorld.app"

 

"d:/symbian/6.1/series60/epoc32/release/armi/urel/HELLOWORLD.rSC"-"!:/system/apps/HelloWorld/HELLOWORLD.rSC"

 

其中,前面"d:/symbian/6.1/series60/epoc32/release/armi/urel/HELLOWORLD.rSC"是要打包安装的文件,"!:/system/apps/HelloWorld/HELLOWORLD.rSC"是安装的目标位置。在其中要注意的是,我们在目标位置中用“!”代替了实际的盘符。这样做得好处是在用户安装的时候,手机系统会提示用户选择要安装的位置,这就给了用户更大的灵活度。另外,在Symbian 系统中,安装的应用程序默认位置是“!:/system/apps ”。

 

编辑好pkg文件后,保存至相应目录。

 

2.3.4.打包程序

 

在命令行中,转至pkg文件所在目录,运行命令makesis HelloWorld.pkg。之后我们就在同一目录下得到了打包好的.sis文件。

 

 

 

2.4 手机测试

 

将打包好地.sis文件上传至手机中,然后在手机的应用程序管理器中就可以看到我们打包好的文件。选择“安装”命令,系统会提示用户要安装的位置,选择安装位置后,我们制作的应用程序就安装到手机中了。

我们回到手机的主菜单,就会发现新安装的HelloWorld 应用程序。打开运行,结果和在模拟器中看到的基本是一样的。

 

三. 应用程序开发简介

 

 

 

3.1 Symbian应用程序类型介绍

 

Symbian OS 中编译的二进制代码由三种目标类型,EXE、APP和DLL。

 

3.2 EXE程序的开发

 

当我们的应用程序并不需要用户界面,只需要使用一个单独进程的时候,我们可以创建.EXE 程序。.EXE程序包含一个主入口E32main(),当系统通过E32main()启动的时候,系统会创建新的进程,并在此进程中创建新的线程。在创建EXE 程序时,我们需要在.mmp文件中将程序的TARGET指定为 EXE 。EXE通常是服务端或命令行程序,通常隐蔽的运行,他没有GUI,不能直接从主菜单运行。

 

下面是一个最基本的控制台应用程序的MMP文件:

 

target           Console.exe

targettype       EXE

UID              0x100039CE 0x10005B91

TARGETPATH      /system/apps/Console

sourcepath       ../src

userinclude      ../in

systeminclude    /EPOC32/INCLUDE

systeminclude    /EPOC32/INCLUDE/LIBC

source           e32main.cpp Console.cpp

library          euser.lib

我们编译程序后,会生成Console.exe。将程序打包安装后,我们无法直接运行此程序。运行此程序可以有两种方法,第一是通过其他程序的调用来运行,第二是使用SeleQ 一类的文件浏览器选择此程序然后运行。

 

 

在这里我们实现了一个console类用来显示上边的文字。我们在设计一个后台程序时候也可以不实现console类,这样程序运行时候在屏幕上将不会有任何显示。

 

3.3 APP程序的开发

 

当我们创建的应用程序需要使用用户界面的时候,我们需要创建APP程序。一个APP程序可能包括自定义的字符串、菜单项、对话框等。如果我们要创建一个APP程序,我们需要在.mmp文件中将程序的TARGET指定为 APP 。

 

我们最熟悉的Helloworld 就是一个简单的APP 程序,下面是它的mmp 文件:

 

TARGET            HelloWorldBasic.app

TARGETTYPE        app

UID               0x100039CE 0x10005B91

TARGETPATH        /system/apps/helloworldbasic

SOURCEPATH        ../src

SOURCE            HelloWorldBasic.cpp

SOURCE            HelloWorldBasicApplication.cpp

SOURCE            HelloWorldBasicAppView.cpp

SOURCE            HelloWorldBasicAppUi.cpp

SOURCE            HelloWorldBasicDocument.cpp

SOURCEPATH        ../group

RESOURCE          HelloWorldBasic.rss

USERINCLUDE       ../inc

SYSTEMINCLUDE     /epoc32/include

LIBRARY           euser.lib

LIBRARY           apparc.lib

LIBRARY           cone.lib

LIBRARY           eikcore.lib 

LIBRARY           avkon.lib 

编译后我们会得到HelloWorldBasic.app,打包安装后我们可以直接选择运行此程序会看到如下图。

3.4 DLL程序的开发

 

DLL提供多个入口,由系统或是已存在的线程(进程)调用。

 

有两种类型的DLL, 静态DLL和多态DLL。

 

静态DLL为其他程序提供方法列表以供调用。当程序启动的链接阶段静态DLL就被读到内存中。

 

多态DLL为其他程序提供某个固定的方法调用。例如某个GUI应用提供了NewApplication()方法调用以启动应用程序。这些DLL实现抽象的方法,如一个打印机驱动,socket协议或是一个应用程序。它们的扩展名多不是.DLL,而是PRN、PRT 或APP等。它们从与DLL相关的类继承,并通常只有在程序需要它们时才读入。前面的APP程序也算作一个多态DLL。

 

如果我们要创建的是DLL程序,我们需要在.mmp文件中将程序的TARGET指定为 DLL。如下所示:

TARGET            test.dll

TARGETTYPE       dll

UID                0x1000008D 0x0CD52435

SOURCEPATH       ../src

SOURCE            test.cpp

USERINCLUDE      ../inc

SYSTEMINCLUDE    /epoc32/include

LIBRARY            euser.lib

 

 

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中的工作。


http://www.ppmy.cn/news/567349.html

相关文章

超极本认知六大误区详解:不只是轻薄+长续航

超极本究竟是什么&#xff1f;在PC行业飞速发展的今天&#xff0c;用户对于PC产品的需求慢慢发生了改变&#xff0c;随着去年平板电脑的升温&#xff0c;移动互联已经从概念逐步进入到了消费者生活、工作的各个领域。在这个时代&#xff0c;还坚持原来笔记本老旧的发展路线必然…

通过爬虫抓取秒懂百科视频

最近想做一个小项目&#xff0c;需要一些百科知识。我便把目标瞄准了百度百科上。 爬取百科文本&#xff0c;相对容易&#xff0c;爬取秒懂百科的视频文件&#xff0c;就有些麻烦了。以前也爬过阳光视频的视频文件&#xff0c;阳光视频在网页源码中能找到一个加密的视频网址。但…

Symbian游戏编程入门 (一)(转)

Symbian成立于1998年&#xff0c;由爱立信、诺基亚、摩托罗拉和Psion共同出资筹建。1999年&#xff0c;松下公司加入Symbian。2000年&#xff0c;世界上第一款采用Symbian操作系统的手机Ericsson R380成功上市&#xff0c;同年&#xff0c;索尼公司和三洋公司获得了Symbian 的授…

[图文]Symbian OS简介(转)

1.1 Symbian操作系统的起源和现状 Symbian成立于1998年&#xff0c;由爱立信、诺基亚、摩托罗拉和Psion共同出资筹建。1999年&#xff0c;松下公司加入Symbian。2000年&#xff0c;世界上第一款采用Symbian操作系统的手机Ericsson R380成功上市&#xff0c;同年&#xff0c;索尼…

python第一单元测试_python单元测试初入门——第一次编程作业

软件工程主页 作业要求 作业目标 代码实现、单元测试、性能分析、PSP表格统计 作业需求&#xff1a; 题目&#xff1a;论文查重 描述如下&#xff1a; 设计一个论文查重算法&#xff0c;给出一个原文文件和一个在这份原文上经过了增删改的抄袭版论文的文件&#xff0c;在答案文…

最新联想bios logo图_笔者教你联想笔记本怎么进入bios设置

电脑专业技术人员都知道,BIOS的主要功能是为计算机提供最底层的、最直接的硬件设置和控制。不过有联想的用户在使用U盘装系统的过程中,却发现联想笔记本进入Bios与其他品牌笔记本不一样,那么联想笔记本怎么进入bios?下面,小编就给大家介绍联想笔记本进入bios的操作方法。 …

什么是CC攻击?

CC攻击&#xff1a;DDOS(分布式拒绝服务攻击)的一种。黑客利用代理服务器或者控制的肉鸡&#xff0c;向目标web网页发送大量的请求&#xff0c;致使CPU处理不过来这么多的请求&#xff0c;长期处于100%的状态。造成通过该页面访问的端口堵塞&#xff0c;正常请求进不来。 怎么…

【C语言督学训练营 第十四天】二叉树真题实战 ----- 层序建树、前中后序遍历、求树的WPL

文章目录 前言树概念二叉树层序建树四种遍历二叉树的方式层次遍历前序遍历中序遍历后续遍历 真题实战&#xff01; 前言 今天进行总结的是考研408有关二叉树的基础知识&#xff0c;是王道C语言督学营的第十四天&#xff0c;随着课程的深入&#xff0c;代码实战的难度慢慢的上来…