WinCE 开发记录

来源:互联网 发布:电视语音遥控器软件 编辑:程序博客网 时间:2024/05/21 07:06

 

记录:
这几天由于项目演示需要,要把原来基于PC&setTopBox的方案扩展到手持终端上,所以就接到了个任务,以最短时间把原来的版本移植到手持终端上,由于原来没玩过Window mobile,而且考虑到时间问题还有PDA处理能力,因此就先做了个简单的版本,不过今天完成出来的效果,还是挺炫d。终于把第一个window mobile软件做出来了,今天以此文记录

 

简单的开发过程,以及遇到的一些问题(好久没写blog了),我的jxta之路也停顿了一段时间!

1 由于之前都是使用mfc开发桌面程序,所以这次在Win CE上也利用了Pocket PC MFC来开发,而且开发过程中,发现基本一致。
2 Pocket PC上的项目只能设置成Unicode,因为之前我都把unicode改成多字节字符,所以这次开发使得出现好多类型转换。
 1)在类似于AfxMessageBox() SetWindowText()这些API都要求参数是LPCTSTR类型的,如果强制将string转换,会导致乱码,如果遇到这种情况,我找到一种简单的办法:
  USES_CONVERSION;
 A2W():Ascii 转换为Wide Char
 W2A(): WideChar 转换为Ascii
 这种转换很方便,不需要使用很复杂的函数。
3 WinCe改变背景颜色问题:在mfc中,可以在OnCtlColor()中改变对话框颜色,而在Wince中,也可以通过该方法来实现,但是会发现,在改变对话框颜色
  if(nCtlColor == CTLCOLOR_DLG )这句话会告诉您CTLCOLOR_DLG 未能标识,通过查看头文件,发现确实没有这个CTLCOLOR_DLG 定义,但很奇怪的是,其他如:
             #define CTLCOLOR_MSGBOX         0
            #define CTLCOLOR_EDIT           1
            #define CTLCOLOR_LISTBOX        2
            #define CTLCOLOR_BTN            3
           #define CTLCOLOR_SCOLLBAR       5
           #define CTLCOLOR_STATIC         6
          #define CTLCOLOR_MAX            7
 都有定义,唯独少了个“4”,只要将代码改为if(nCtlColor == 4)就可以改变对话框颜色了,微软为什么会这样做呢?
4 在socket api上,有些setsockopt 在WinCE上会不支持,本来觉得下载速度挺慢,想把接收缓冲区设大点,但是在setsockopt(sock,SOL_SOCKET,SO_RCVBUF,xx,xx)时,就会提示10042错误码,这个错误码是说不支持在该层次上或者该options上设置,通过查找,发现以下解释:
 In Platform Builder 4.0, the documentation incorrectly states that setsockopt() supports the SO_RCVBUF option.
 In fact, support for the SO_RCVBUF option was later added in Windows CE .NET version 4.1. The Platform Builder 4.1 documentation was updated to reflect the fact that you can use SO_RCVBUF for datagram sockets.只能在datagram socket上设置,查看msdn上也说明了only for datagram sockets。

5 这次没有用CSocket这个鬼玩意,舒服好多,只少在多线程上,不会遇到莫名其妙的错误,CSocket上需要attach,detach,烦死人,在csdn 论坛上经常会发现有人问这个问题,还是用api吧,舒服,自己好控制!!

6 这次虽然说软件比较小,但是还让我用observer pattern做了一个不错的选择,因为在tcp下载中,下载完会导致两种不同的update方式(一种是更新树形列表,一种是打开播放媒体),如果用定时器轮询变量,以确定是更新完毕,肯定不好。于是使用了observer pattern,通过接口observer继承出两个xxobserver,大家各自有自身的update方式,这样

在程序中只需多态使用这个update,就可以达到更新效果,而且代码也容易写,好维护,不错不错!模式还确实使我了解到了一些基本的面向对象,至少有一点点的感觉。

7 WinCE在测试udp 组播时,如果当时Window mobile通过usb连接到pc上,这样测试不了udp(当时我搞了好久,一直以为代码错误),据说是端口有关(具体没查),如果要测试组播,就需要把usb拔下来就可以测试。

8 测试tcp可以直接通过pc上的Pocket pc仿真器来模拟就ok了,简单介绍一下我了解的模拟过程:
 1)vs2005的Pocket pc仿真器默认放在program file里面的Microsoft Device Emulator文件夹下,在里面有一个“dvcemumanager.exe”这个就是用来管理仿真的工具
 2)打开仿真器,然后右击设备点“连接”,设备就会弹出来,然后再右击“插入底座”,此时就会与pc上同步连接,pc上的连接设置需要勾上“允许连接到其中一下任何一个端口”
 3)此时的仿真器就和你的手持设备一样,可以通过usb互相copy数据了。
9 一些基本函数使用:
 1 获取路径:
  USES_CONVERSION;
  wchar_t pBuf[256];
  GetModuleFileName(NULL,pBuf,sizeof(pBuf)/sizeof(wchar_t));
  strAppPath = W2A(pBuf);
 2创建文件夹
  strMediaDirPath += "//Media";
  CreateDirectory(A2W(strMediaDirPath.c_str()),NULL);

ok
that's all!

下面是效果图

 

图

 

原创粉丝点击