使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台 |
| 作者:CSDN 来源:CSDN 发布时间:2006-11-30 22:10:31 |
|
编辑完成后编译生成一下项目,这样就会在SYMBIAN 的模拟器目录中生成 一个所谓的 HelloWorld.mbm 与 HelloWorld.mbg 文件,在SYMBIAN的SDK目录下搜索找到 HelloWorld.mbg并用记事本打开,你可以看到以下的类似内容 在这之前我们提过HelloWorld.mbm文件,其实这个才我们程序里真正要载入的位图资源文件。打开HelloWorldContainer.h,在CEikLabel类的定义前面输入以下代码 刚看到 _LIT 很多人会问起这是一个什么函数啊,其实这个不是函数,这个是一个预定义宏,在这里我们通过_LIT宏将"HelloWorld.mbm"这个字串赋值给KMbmFileName常量,其实在Symbian 里面没有类似windows平台的字符串类型(string),取得代之的是被称做 描述符(descriptor)的对象 。关于描述符的更多帮助请查看相关的资料。 Symbian os 手机操作系统的文件系统与windows的文件系统是类似的,所以只给出一个"HelloWorld.mbm"文件不足以让程序找到这个文件的具体位置并装载进程序里,此时我们需要取得这个文件在操作系统里的绝对路径,请打开 HelloWorldContainer.cpp 文件,在CHelloWorldContainer::ConstructL 函数里添加以下的代码, 在这里我们创建了一个标准的可修改标识符fullName,包含了我们的mbm文件名,接下去的第二行代码则把应用程序的路径添加到这个fullName中,使fullName成为一个绝对的文件路径。估计到这里,你应该可以猜出ConstructL函数是什么意思了吧?呵呵,好了,让我们编译一下程序,跟踪一下fullName是一个什么路径吧,按上F5,等待............不是吧,出错了,VS.NET报出了 如果你想知道fullName到底会是一个什么样的值,你可以在 CompleteWithAppPath(fullName);的下一行代码处设置一个断点,按F5编译生成并运行模拟器,打开你的程序,运行到了断点处时,程序会停下来,光标定位在了IDE窗口,通过IDE的自动窗口我们可以看到fullName此时的值 。
此时我们发现fullName的值为 Z:\System\Apps\helloworld\HelloWorld.mbm,(如果你没有发现以上的窗口,请依次打开VS.NET的菜单 调试->窗口->自动窗口)。在这里 Z 代表了手机模拟器的驱动器,当你安装到了目标手机上后,这个驱动器就会变成C,或者是E了。 好了,接下来我们来让程序显示出我们添加的位图。首先我们在HelloWorldContainer.h 头文件中添加以下代码 CFbsBitmap* iImage; 接着定位到HelloWorldContainer.cpp 的ConstructL函数中,在我们之前编写的代码下面输入 iImage = new (ELeave) CFbsBitmap(); gc.BitBlt(TPoint(0,0),iImage); 这样就通过了图形上下文(graphics context,gc)将你的位图复制到了屏幕的左上角。 编译一下,OH,MY GOD ,又出错。具体错误信息为 HelloWorld error LNK2019: 无法解析的外部符号 "public: __thiscall CFbsBitmap::CFbsBitmap(void)" (??0CFbsBitmap@@QAE@XZ) ,该符号在函数 "public: void __thiscall CHelloWorldContainer::ConstructL(class TRect const &)" (?ConstructL@CHelloWorldContainer@@QAEXABVTRect@@@Z) 中被引用 HelloWorld error LNK2019: 无法解析的外部符号 "public: int __thiscall CFbsBitmap::Load(class TDesC16 const &,long,int)" (?Load@CFbsBitmap@@QAEHABVTDesC16@@JH@Z) ,该符号在函数 "public: void __thiscall CHelloWorldContainer::ConstructL(class TRect const &)" (?ConstructL@CHelloWorldContainer@@QAEXABVTRect@@@Z) 中被引用 还是同样的原理, 我们要引入一个库文件才能解决这个问题,请在项目资源管理器中右击项目->属性->配置属性->链接器->命令行 ,在右边的 附加选项 中输入 fbscli.lib 再次编译,OK了,好现在我们运行这个程序,哈哈,图像在我们的程序里显示出来啦。好高兴。 可是当我们退出程序时却出现了程序已关闭的错误。 我的天哪,怎么会这样呢,为什么我的程序不能正常退出呢,遗憾的是模拟器只提示了很简单的错误提示,并没有更详细的错误报告,我们可以通过在 C:\Symbian\8.0a\S60_2nd_FP2_SC\epoc32\wins\c\System\Bootdata 下创建一个 ErrRd 的空文件以让模拟器显示详细的错误信息(请在相应的SDK目录下操作),此时我们再次运行模拟器打开HelloWorld并关闭它,现在是不是提示信息多了一点呢? 模拟器报出了 ALLOC:17B18158 的错误,像这种类型的错误大多数情况下是因为我们使用了某个对象后忘记关闭它并释放此对象的内存导致的,为了保证程序的正常运行,我们要在使用一个对象后及时将它删除掉,于是我们定位到了HelloWorldContainer.cpp的~CHelloWorldContainer (析构函数) 中 输入以下代码 当我们再次编译运行程序后,就不会再出现那讨厌的出错对话框了。 5.让我们添加一些功能 5.1 为菜单添加项目 打开HelloWorld.hrh ,修改THelloWorldCommandIds 的枚举定义,改成以下 EHelloWorldCmdL |
| [] [返回上一页] [打 印] |
文章评论 |

