WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程Symbian基础知识使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台

使用Carbide.vs与VS.NET2003构建Symbian开发平台-S60 平台
作者:CSDN  来源:CSDN  发布时间:2006-11-30 22:10:31

      编辑完成后编译生成一下项目,这样就会在SYMBIAN 的模拟器目录中生成 一个所谓的 HelloWorld.mbm 与 HelloWorld.mbg 文件,在SYMBIAN的SDK目录下搜索找到  HelloWorld.mbg并用记事本打开,你可以看到以下的类似内容
 
 enum TMbmHelloworld
 {
 EMbmHelloworldPicture
 };
 
       这个枚举类型TMbmHelloworld就是HelloWorld项目的位图定义了,刚才我们已经添加了一个名为Picutre.bmp的位图文件,EMbmHelloworldPicture就是对应了我们的那个Picutre.bmp位图文件,接下来我们的任务就是让HelloWorld显示这个位图。

 在这之前我们提过HelloWorld.mbm文件,其实这个才我们程序里真正要载入的位图资源文件。打开HelloWorldContainer.h,在CEikLabel类的定义前面输入以下代码
  
 #include "HelloWorld.mbg"
 _LIT(KMbmFileName,"HelloWorld.mbm");

       刚看到 _LIT 很多人会问起这是一个什么函数啊,其实这个不是函数,这个是一个预定义宏,在这里我们通过_LIT宏将"HelloWorld.mbm"这个字串赋值给KMbmFileName常量,其实在Symbian 里面没有类似windows平台的字符串类型(string),取得代之的是被称做 描述符(descriptor)的对象 。关于描述符的更多帮助请查看相关的资料。

      Symbian os 手机操作系统的文件系统与windows的文件系统是类似的,所以只给出一个"HelloWorld.mbm"文件不足以让程序找到这个文件的具体位置并装载进程序里,此时我们需要取得这个文件在操作系统里的绝对路径,请打开 HelloWorldContainer.cpp 文件,在CHelloWorldContainer::ConstructL 函数里添加以下的代码,
 
 TFileName fullName(KMbmFileName);
 CompleteWithAppPath(fullName);//自动为文件名添加文件路径

       在这里我们创建了一个标准的可修改标识符fullName,包含了我们的mbm文件名,接下去的第二行代码则把应用程序的路径添加到这个fullName中,使fullName成为一个绝对的文件路径。估计到这里,你应该可以猜出ConstructL函数是什么意思了吧?呵呵,好了,让我们编译一下程序,跟踪一下fullName是一个什么路径吧,按上F5,等待............不是吧,出错了,VS.NET报出了
error C3861: “CompleteWithAppPath”: 即使使用参数相关的查找,也未找到标识符 的错误,有过一定编程基础的人会想到肯定是哪个文件或库没有给引进来,猜对了,我们需要把一个 aknutils.h 的头文件包含进我们的源代码中,请打开 HelloWorldContainer.h 并加入 #include "aknutils.h"。加完后再试试,是不是已经不会报错了?

        如果你想知道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();
 User::LeaveIfError(iImage->Load(fullName,EMbmHelloworldPicture));
 
           再定位到 HelloWorldContainer.cpp 的Draw()函数 并在最后面输入

 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 (析构函数) 中 输入以下代码
 
 delete iImage;

    当我们再次编译运行程序后,就不会再出现那讨厌的出错对话框了。

 

5.让我们添加一些功能
 
 我们已经实现了在程序里显示位图的功能了,接下来我们将实现一个登陆框的功能,到时将会用到资源文件。

5.1 为菜单添加项目
 打开 HelloWorld.loc 文件,定义菜单的文本
 
 #define qtn_view1_login_item "Login"

 打开HelloWorld.hrh ,修改THelloWorldCommandIds 的枚举定义,改成以下
 enum THelloWorldCommandIds
 {
     EHelloWorldCmdAppTest = 1,
     EHelloWorldCmdLogin
  };

 EHelloWorldCmdL

上一页  [1] [2] [3] [4]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码