Windows Mobile开发总结

来源:互联网 发布:中世纪2优化 战报 编辑:程序博客网 时间:2024/05/16 05:08

  结合自己4,5月份开发手机视频监控系统经历, 来对那段时间的Windows Mobile开发进行总结一下. 说起Windows Mobile开发这事自己几乎是从零开始起步, 原先主要从事J2EE/Asp.Net下的Web应用开发, 从来没有接触过移动应用开发方面; 说零起步, 夸张点了, 好在至少对自己决定采用的开发工具Vs 2005还是有相当了解的, 从大学开始就用它开发Asp.Net/WinForm项目, 那就是说在开发工具上没有什么大问题了, 一个好的工具, 可以极大地提高我们的开发效率; 以及加上去年进入这家主要从事安防监控方面的公司, 虽然安排主要还是做Web开发, 但供Web监控使用的视频监控ActiveX控件也需由我来实现; 毕业之后一直使用的不是C#就是Java, 在大学里学得那点C++, 早就还给老师了. 针对自己这点可怜的C++开发基础, 对即将从事的手机上应用, 明显不足. 后来我花了2周时间去巩固C++, 主要学习Socket网络通信, 多线程处理等跟项目关联密切内容,如果你打算学习Win32来开发WM应用的话, Programming.Windows与Programming WinCE NET 3rd这2本书不错, 当然入门对照着MSDN看微软SDK带的例子学习更加是一个好途径, 基本上开发常见功能都有介绍, 如菜单,对话框全屏,TreeView控件等, 值得用心去体会. 如果是C#的话也类似, 边看书,边看文章,边看WebCast,基础要尽量打扎实。该项目平台是vs 2005 + WM 5.0 SDK(Pocket PC), 开发语言采用Win32(直接是C++ + SDK API), 因为公司就安排我一个人做手机客户端开发, 提供视频流的服务端由另外人来完成.

  希望能够与有跟我有着类似经历或者有志于WM开发的XDJM多多交流, 下面我将从开发环境搭建, 模拟器使用, 具体应用开发等方面来加以总结. 我的弯路大家可以

避免, 我的经验大家可以分享。

 

手机视频监控系统

    先允许我简单介绍一下什么是手机视频监控系统? 手机视频监控作为手机上多媒体/流媒体应用其中一种, 特别是在当前国内3大电信公司大力推行3G网络背景下, 其

在音视频应用方面占了较大比重, 也是3G下的一大亮点. 手机视频监控系统是通过用户的手机随时随地来观看远程监控点的视频。并允许用户进行远程云台控制, 本地

录像存储与回放, 监控场地发生意外情况时,通过活动视频向手机报警或短信, 彩信截图通知.

实际可应用的范围:

  - 商业店铺:商场店铺的监控,收银、货架、出入口监控

  - 居民住宅:室内远程图象报警、小区 / 大楼安全防范、物业的无人监控

  - 教育行业:幼儿园、小学校的教学评估,家长远程监控

  - 旅游行业:宾馆饭店的楼层管理、重点文物及景点的保护

 


 

Windows Mobile开发环境搭建

01. 开发环境搭建  

开发环境搭建对一个初学者来说是一件很头疼麻烦的事情, 好在在DevDiv论坛上看到了一个讲述环境搭建与快速入门的视频教程相关介绍帖子,  很值得一看!

02. VS2005/VS 2008创建智能设备项目失败的解决方法

当初微软发布IE8的时候, 下载安装看看, 谁知道搞得VS 2005弹出一个窗口提示网页脚本错误, 创建智能设备项目失败. 好像IE7下也有这个问题, 我是立马把IE8干掉了。

03.  调试问题

在启动模拟器调试时候提示DLL无法加载,找不到指定的模块,以及遇调试中"系统找不到指定的路径"的问题, 应该怎么解决呢? 这类问题一般是由程序所需的DLL没有跟应用程序一起部署到手机上.

04. 模拟器部署程序不成功, 无法启动程序

模拟器部署程序不成功,不外乎3个原因, 1跟问题3类似缺少dll, 2上次运行程序没有正常退出, 还在运行, 可以从开始-->设置-->系统-->内存下检查有没有相关进程在运行, 3共享冲突且文件无法删除. 开发时候, 不时模拟器上出一些怪异现象, 我几次发现调试socket时候, 程序死活连不上服务器, 程序出现错误异常报告, 不知道何原因. 发现模拟器问题。可以采用如下步骤:
软重启,如果启动后无效进入下一步(选择模拟器菜单Soft Reset一般情况下上述问题都可以在这里得到解决, 平时保存模拟器状态前先把手机上的网络链接断开)
硬重启,如果还是无效进入下一步
卸载images,再次安装。

 

05. 模拟器上网
最简单方式是通过ActiveSync来上网, 另外一种比较复杂需要安装一个Microsoft Virtual PC通过PC网卡上网,

 

06. 模拟器上中文显示

Vs 2005默认安装是英文版的模拟器, 在其上面, 中文不是显示成□或者就是?, 甚至就是空白, 在界面上啥都没有显示出来; 这个问题你可以安装中文版的模拟器来解决, WM5安装Windows Mobile 5.0 Emulator Images for Pocket PC - CHS.msi, 如果你是采用WM6开发的话安装Windows Mobile 6 Professional Images (CHS).msi, UI等具体实现

07. 全屏窗体实现

在实现全屏窗体时候经常会碰到如何隐藏mobile默认最下方的bar条, 输入法又突然冒出来; 实际上要实现全屏, 一般情况下采用SHFullScreen + MoveWindow +

 

08. 如何去掉窗体上的关闭按钮?

SHDoneButton(hWnd,SHDB_HIDE);
SetWindowLong(hWnd,GWL_STYLE,WS_NONAVDONEBUTTON );
同时进行一下基础知识扫盲, PPC上窗体的关闭与最小化, 图来自黎波老师的博客文章. 在默认情况下,我们新建的窗体运行时屏幕右上角显示一个×按钮,
按照我们使用 Windows 的习惯,应该是用来关闭窗体。其实不是,它只是最小化窗体,并没有关闭。如果这个窗体是一个应用程序的主窗体,那么该程序并
没有退出,而是隐藏了。可以通过重新运行该程序的 exe 文件来恢复显示程序的运行界面或者到运行程序列表中进行激活显示。

09. 关于SIP开关后对话框的显示问题

也就是怎样实现软键盘打开, 对话框自动适应? 我们在开发过程中也会碰到, 如果对窗体中控件位置计算不正确, 会出现当输入法打开时把窗体上的编辑框给档住了,怎样实现输入法打开对话框自动上移? 可以响应WM_SETTINGCHANGE消息,通过SHSipInfo函数去得到输入法面板参数和桌面可视区域参数,然后配置你的对话框。

SIPINFO si  =  {0};  
si.cbSize   =  sizeof(si);
SHSipInfo(SPI_GETSIPINFO, 0, &si, 0);
BOOL bShow = si.fdwFlags&SIPF_ON;  // 如果bShow为TRUE,则软键盘显示,否则隐藏;使用si.rcSipRect和si.rcVisibleDesktop来实现你的需求。

 

10. WM手机默认中文编码是什么?

默认编码是Unicode, 所有的WM手机都是UNICODE的,  且SP平台和PPC都一样! 很多跟我一样刚接触WM开发的人都会碰到一个问题, 为什么同样的代码在VC6开发

的应用程序中没有问题, 但把相关代码复制到Windows Mobile上运行就出现如此多的编译错误, 如error C2664: 'CWnd::MessageBoxW' : cannot convert

parameter 1 from 'char [100]' to 'LPCTSTR'. 都是没有考虑到这一点(编码问题), 需要使用提供的字符串相关的API与函数加以处理.

下面简单介绍Unicode C-Runtime 转换函数

mbstowcs( 
wchar_t 
*wcstr, // Output string.
const char *mbstr, // Input string.
size_t count ); // Character count

 

 

wcstombs( 
char *mbstr,         // Output string.
const wchar_t *wcstr, // Input string.
size_t count );        // Character count

 

MultiByteToWideChar与WideCharToMultiByte

// 演示API使用, UTF-8转换Unicode汉字代码(Copy修改即可)
 char  str[256= {(char)0xE4,(char)0xBD,(char)0xA0,(char)0xE5,(char)0xA5  ,(char)0xBD,(char)0x61,(char)0x62,(char)0x63,(char)0}//一段UTF-8编码  
 WCHAR*  strA;  
 
int  i = MultiByteToWideChar(CP_UTF8, 0, (char*)str, -1, NULL, 0);  
 strA 
= new WCHAR[i];  
 MultiByteToWideChar(CP_UTF8, 
0, (char  *)str, -1, strA, i);  
 i 
= WideCharToMultiByte(CP_ACP, 0, strA, -1, NULL, 0, NULL, NULL);  
 
char *strB=new char[i];  
 WideCharToMultiByte(CP_ACP, 
0, strA, -1, strB, i, NULL, NULL);  
 
//strB即为所求  
 
//AfxMessageBox(strB);
 delete []strA;  
 delete []strB; 

 

11. 在Windows Mobile下使用XML

XML当前被大量使用于应用程序配置, 存储少量数据以及Web Services等应用; 甚至到通信报文内容也以xml格式来传递, 方便服务端数据在不同手机与开发平台上

解析. 因为不管是C++, C#, 还是Java语言都有提供相关API来解析XML格式内容.

 

 

12. 如何建立拨号链接进行网络通信

在WM中需先进行拨号链接操作, 链接成功建立后才可以进行后续的Socket通信等; 感觉这方面微软处理没有Symbian下那么友好, Nokia手机会在你的应用首次使用

网络时, 弹出窗口提醒你该操作可能产生GPRS流量费用, 询问你采用何种上网方式接入, 是cmnet还是cmwap.

 

 

13. 界面美化 - 贴图

   用户对手机软件的界面是很在意的,做的好看了他会觉得有技术含量,做的好用了他会更加喜欢我们的产品。所以一套好的UI是必不可少的。手机软件开发的大部分

工程是在做UI系统。一套好的自主的手机软件UI系统是产品核心竞争力的一部分。在Windows Mobile的界面开发,使用C + SDK做漂亮的界面不容易,一旦在界面上控

件比较多,控件的布局更是头痛。横竖屏切换的时候也得考虑,不同手机屏幕尺寸可能也不一样; 不同的字体下, 界面差异也非常大……

   其实要做出好的界面最后还是要回归RECT,也就是自己绘制贴图。 如果要做的很漂亮,那还是自己封装一套界面控件,这样控制起来方便。横竖屏问题,你绘制的

时候不应该写死的位置坐标,应该取相对坐标。在横竖屏切换的时候会触发WM_SIZE等一些消息,里面改变相对坐标的横竖屏大小就OK啦.

   拿配置信息设置窗口来说, 主要需处理WM_PAINT, WM_MOUSEMOVE, WM_LBUTTONDOWN等一系列窗口消息.

相关参考代码

 

 最终实现效果大致如图下:

窗体界面贴图处理