window mobile 开发常见问题

WindowsMobile开发常见问题集

(一)
1、Q:新建项目的时候选择哪个项目类型才能创建智能设备的应用程序?

A:在VisualStudio的新建项目对话框中选择VisualC#或者VisualBasic项目类型,选择智能设备模板,然后再选择相应的设备SDK,最后选择“DeviceApplication”,就可以创建一个移动设备的应用程序了。

2、Q:托管代码与本地代码有哪些区别?

A:托管代码是指使用.NETCompactFramework开发的程序代码,可执行文件被编译成IL,执行时需要有.NET的运行时环境。而本地代码指用C++等语言开发的程序代码,可执行文件被编译成与CPU指令集有关的机器码,可以直接运行。

3、Q:能不能简要介绍一下Magneto里面对OTA和MMS的支持?

A:Magneto对OTA有很好的支持,SDK文档的通讯部分中,有针对OTA的专门介绍。MMS的应用程序基本都是由第三方开发的,因为MMS是基于WAP协议的,而Magneto本身对WAP的支持也很好,具体的协议也可以在SDK文档里找到。

4、Q:请问用VisualBasic.NET开发PDA数据库程序能不能使用ADO.NET?

A:VisualBasic.NET开发PDA数据库不需要引用System.data.oledb,只需要引用System.Data.SqlServerCe命名空间就可以了。该命名空间中的数据库操作类和ADO.NET是基本一致的。可以用它们来开发针对SQLServerCE的应用程序。

5、Q:在VisualC++2005中,可以使用.NetCompactFramework吗?

A:不能,现在.NETCompactFramework只支持C#和VB.NET,而不支持C++/CLI。但是在VS.NET2005中可以用C++来开发Native代码来支持移动设备。

6、Q:从什么地方可以得到Smartphone开发环境?

A:Smartphone的SDK可以在微软网站上找到,而VisualStudio2005Beta2可以通过参加微软活动的方式获得。MEDC2005的参加者都获得了VS.NET2005和WindowsMobile5SDK的开发光盘。

7、Q:托管性的代码执行效率怎么样?和使用VisualC++编写的代码相比较。

A:托管代码的执行效率肯定不如本地代码高,但是托管代码也有一些好处是无法取代的。

8、Q:是否可以使用VisualStudio.NET2003来开发能够运行在WindowsMobile2005上的应用程序?

A:首先更正一下,WindowsMobile最新一代的操作系统叫做WindowsMobile5,而不是WindowsMobile2005。是的,使用VS.NET2003开发的应用程序是可以在WindowsMobile5上正常运行的,因为WindowsMobile5ROM中内置了.NETCompactFramewrok1.0SP3。

9、Q:PDA上不能用PocketAccess么?SQLCE太大了。

A:可以使用PocketAccess来开发WindowsMobile上的应用程序。可以采用C++调用OLEDB或者ADOCE的方式来访问PocketAccess数据库。

10、Q:VisualStudio2005的新功能是否只在WindowsMobile5里受到支持,2003是否支持?

A:新功能分两个部分,一部分是.NETCompactFramework2.0中提供的的新功能,这部分的功能可以被WindowsMobile2003支持,但必须安装.NETCompactFramework2.0;而另一部分是WindowsMobile5的特有功能。.NETCompactFramework2.0和WindowsMobile5开发文档的“What’sNew”部分,分别描述了这两方面的新特性。

11、Q:请问如何在模拟器里面配置连接到移动网络?

A:模拟器如果需要连接移动网络的话,必须有专门的硬件提供支持。可以在开发PC的串口上连一个GPRS的模拟器,SDK文档中对此有专门的说明。

12、Q:SQLCE可以像PocketAccess那样仅使用一个文件就能运行么?是否需要像PC上那样安个服务器才能使用?

A:不会的,只需要在WindowsMobile上安装SQLServerCE的支持库,也就是就是一些DLL文件。而SQLServerCE的库文件是一个单独的文件,不需要安装一个服务器。

13、Q:开发好的程序通过什么方式部署到手机上?对手机有什么要求?

A:开发的程序需要打包成cab文件部署到手机上。除了通过ActiveSync安装外,还可以通过网络下载、存储卡运行等方式来安装应用程序。对手机的要求是,必须和开发程序的目标平台相兼容。比如为WindowsMobile5开发的应用程序,可能就没办法很好地运行在WindowsMobile2003平台上。

14、Q:在模拟器上面开发程序,和真实环境有区别么?需要注意一些什么?

A:模拟器的仿真度十分高,WindowsMobile5的模拟器甚至可以支持ARM指令,所以基本不会遇到兼容性的问题。但是对于一些需要连接外部设备的应用场景,比如前边说的无线网络,还有GPS设备等,就需要用到实际设备了。

15、Q:当开发国际化应用程序时,应该特别注意哪些方面?

A:对于国际化的应用程序,.NET本身就已经提供了非常好的支持。可以把用户界面的文字保存在相应的资源文件中,然后由应用程序判断操作系统的语言版本来调用相应的文字。

16、Q:用.NET开发PocketPC程序需要考虑设备具体使用的是哪种CPU吗?

A:不必。无论是在虚拟机上的x86指令集,还是实际设备上的ARM指令集,对.NETCompactFramework程序的运行来说都一样。

17、Q:WindowsMobile5是否支持通过语音控制新的开发程序?

A:现在还不支持。

18、Q:可以在vwd2005bata2中开发PocketPC程序吗?PocketPC是否具有浏览器?

A:可以,PocketPC平台是内置浏览器的。

19、Q:VisualStudio2005的Mobile开发,支持Mobile2003的设备吗?

A:支持,VS2005本身就自带WindowsMobile2003的SDK。

20、Q:WindowsMobile5.0forSmartphone较之前的版本有何明显的区别?对于测试这一领域,我们需要注意些什么?

A:WindowsMobile5的Smartphone平台更多的变化是在API层面,比如对数据库的支持、对GPSAPI的支持等,WindowsMobile5SDK文档中对此有详细地说明。

21、Q:对开发来说CDMA和GPRS的数据传输是透明的吗?

A:对于软件开发来说数据传输是透明的,CDMA和GPRS对于上层应用程序来说,只要支持HTTP协议或者TCP/IP协议就可以进行数据传输的操作。

22、Q:VisualStudio.NET能否支持Nokia的S60系列系统开发?

A:可以,VisualC++能支持NokiaS60的开发。

23、Q:PocketPC与Mobile开发的主要区别在哪里?

A:WindowMobile是微软公司基于WindowsCE.NET的一个平台。它包含PocketPC和Smartphone两个版本。

24、Q:SDE从哪里可以下载?PocketPC2005的模拟器可以从哪里下载?

A:SDE是早期用来开发移动设备程序的VS扩展,目前网上似乎很难找到。其实不用安装它,安装所需版本的PocketPC或者Smartphone的SDK即可。各个版本的WindowsMobile开发的SDK和模拟器的地址可以从这篇Blog上下载(http://twodays.cnblogs.com/archive/2005/06/30/184107.htm)。

25、Q:.NETCompactFramework2.0能装在WindowsMobile2003上吗?

A:可以。.NETCompactFramework2.0必须手动安裝到WindowsMobile2003的机器上。

26、Q:请问有没有好的WindowsMobile编程的网站或者论坛?

A:OpenNETCF.org、[url]www.devbuzz.com[/url]、[url]www.codeproject.com[/url]、[url]www.msdn.com/mobility/[/url]、[url]www.pocketpcdn.com[/url]

27、Q:WindowsMobile2003上的.NETCompactFramework能升级到.NETCompactFramework2.0吗?

A:可以。.NETCompactFramework2.0必须手动安裝到WindowsMobile2003的机器上。

28、Q:请问编写WML文件与使用.NETCompactFramework进行开发有什么联系和区别?

A:WML是能够利用WAP浏览器进行浏览的文件,是一种基于Web的开发方式。.NETCompactFramework是在设备上运行的程序,是基于应用的开发方式。

29、Q:在使用.NETCompactFramework1.0进行开发时,用EVC直接调用Native代码与使用C#通过P/Invoke在性能上有什么差别?在.NETCompactFramework2.0上,用C++直接调用和用C#通过P/Invoke又如何呢?

A:用EVC調用NativeAPI的效率,会比使用.NETCompactFramework通过P/Invoke调用NativeAPI要高,这是.NETCompactFramework本身的特性。在从托管代码中调用NativeAPI时,其内部会进行一些额外的类型转换动作,这会导致效率的降低。

30、Q:有没有支持显示HTML文本的控件?

A:WebBrowser控件可以用于HTML文本。

31、Q:CAB安装后会在PocketPC上自动生成“卸载程序”,如何制作安装包,才能不自动产生“卸载程序”?

A:利用VS2005建立SmartDeviceCabProject,在SolutionExplorer的CabProject上点击鼠标右键选择Property,即可看到有一个选项为NoUninstall,默认为False,改为True就可以了。

32、Q:OpenNETCF能运行在.NETFramework1.1环境下吗?其中的控件可以与.NETFramework1.1控件混合使用吗?怎样在VisualStudio.NET2003中加入OpenNETCF控件?

A:当初在设计NETCompactFramework1.0/1.1时,由于考虑到移动设备的资源有限,所以有些原本.NETFramework1.1中已经提供的类和控件就被删除了,OpenNETCFSmartDeviceFramework主要是针对.NETCompactFramework1.0/1.1中没有的功能,开发出来的类似的类型和额外的功能,以弥补.NETCompactFramework1.0/1.1不足之处。这套Framework主要是供.NETCompactFramework程序开发所用,除了少部份针对PC与PocketPC的同步功能所编写的类之外,大部分都是在.NETCompactFramework上执行的,一般不支持.NETFramework。OpenNETCF的SmartDeviceFramework安装完毕之后,可以在VS2003左侧的工具箱中看到OpenNETCF的控件,可以直接拖放来使用。

(二)
1、Q:请问如何才能保证应用程序能够及时地释放系统资源?
  
  A:由于.NETCompactFramework所运行的移动设备,受限于CPU、内存、电源,因此其中的GarbageCollection时经过调整的,垃圾回收的速度比.NETFramework更快。通过调用Dispose()方法,可以立即释放掉对象所占用的非托管资源。

2、Q:在VisualStudio中可以定义一个所有文件都可以使用的宏吗?比如:#defineAA,要求在所有的.cs文件中都可以使用#ifAApublicclassA()#elsepublicclassB();

  A:可以。在VS2005的解决方案资源管理器中,用鼠标右键单击项目,选择其属性。在属性对话框的Build页中,可以找到conditionalcompilationsymbol,在其中输入AA,即可在该项目的所有C#源代码文件中使用这个符号。

3、Q:可以将Smartphone应用程序转换为PocketPC应用程序吗?

  A:可以。在.NETCompactFramework2.0中,只要您没有用到某些特殊的API,PocketPC应用程序与Smartphone程序是可以互相转换的,只需要在控件上做些调整即可。

4、Q:.NetFramework2.0有没有对Mediacoder/decoder的支持?开发第三方的媒体播放程序可以不依赖.NetCF2.0吗?

  A:.NETCompactFramework2.0本身可以开发Direct3DMobile的应用程序。也可以在VS2005中以C++开发NativeCode的媒体播放程序,而无须依赖.NETCompactFramework2.0。

5、Q:使用.Net开发的智能设备程序是否比用C语言开发的程序效率低很多?

  A:使用.NET开发的程序会比使用C语言开发的本地程序要慢一些,不过对于一般的应用软件来说,下率不会差太多,除非是需要实时处理硬件或I/O的程序,必须要使用C语言进行开发之外,一般的应用程序用.NETCompactFramework开发即可,因为这样可以获得最好的灵活性和可移植性。

6、Q:用托管C++开发的应用程序执行效率会不会比用C#开发的应用程序高?

  A:不会。由於托管C++与C#源代码在经过编译之后,都将成为IL代码,由.NETCompactFramework来执行,因此在效率上不会有差别。

7、Q:请问.NETCompactFramework2.0对于使用不同CPU的移动设备支持好吗?.NETCompactFramework2.0在GSM应用方面有没有增强?
  A:.NETCompactFramework具有WindowsMobile跨平台的特性,因此开发时不需要考虑底层的OS、CPU和其它硬件因素。目前.NETCompactFramework对常见的CPU都能够支持,例如ARM、MIPS、SH、x86等。另外在GSM应用方面,主要针对Smartphone的应用作了加强。
8、Q:请问MFC在WindowsMobileDevelopment中处于什么地位?DouglasBoling写的ProgrammingMicrosoftWindowsCE.NET一书中好像并不推崇使用MFC开发WindowsMobile应用程序。

  A:MFC还是以本地C++的方式进行开发,其特点是执行效率高,但必须花费更多的心思在資源分配、回收等编程技巧上。如果使用.NETCompactFramework进行开发,虽然执行效率比本地程序略差,但整体而言,可移植性与灵活性都较好,而且不必为回收资源担心,开发者能够专注于真正重要的业务逻辑流程。

9、Q:.NETCompactFramework2.0与1.0有什么区别?

  A:.NETCompactFramework2.0主要针对1.0原有的控件及类库进行了改善,提供了更多的支持,并新增了许多类型和控件,.NETCompactFramework2.0更加接近.NETFramework,同时在效率上也相对1.0有所提升。

10、Q:在制作安装程序的时候,如何在start->program菜单中生成程序的快捷方式?

  A:在VS2005中建立SmartDeviceCabProject,在FileSystem页面中,可以看到ApplicationFolder,这就是Start->Program的位置,可以先建立PrimaryOutput的快捷方式,然后将此快捷方式移到ProgramsFolder,并构建Cab文件即可。

11、Q:移动设备与WEB网页设计有什么主要区别?

  A:VisualStudio开发环境中移动设备与Web设计是非常类似的,可以使用同样的语言进行设计,不同的只是能够使用的类以及控件有所区别。

12、Q:.NETCompactFramework中可以实现鼠标的双击、右击、中间键单击等用户事件吗?

  A:运行WindowsMobile的设备没有鼠标,所以这些事件也不存在。对于常用的右键弹出上下文相关菜单,在触摸屏上一般用单击并且按住一段时间来实现。

13、Q:Mobile应用程序的界面处理可以使用CSS样式表吗?

  A:不可以。

14、Q:Smartphone上面能够支持横屏幕吗?

  A:不支持。

15、Q:如何在PocketPC中调整控件的位置使得应用程序可以支持横向屏幕?

  A:可通过设置控件的Anchor和Dock属性来自适应屏幕。

16、Q:界面开发完成后,在移植方面需要注意些什么?

  A:一般来说,要移植到不同平台上必需要重新设计用户界面;可以重用的只是业务逻辑,不是用户界面。
17、Q:我在移动开发过程中用到了很多控件,难以在一页之内显示,如何为它们添加一个滚动条?

  A:可以将这些控件放到一个Panel中,并设置其AutoScroll属性为true即可;如果使用VS2005,拖拽数据源到窗体上时,会自动将所有控件包括在一个Panel里。

18、Q:TableAdapter在.NETCompactFramework1.0中从未出现过,是新特性吗?

  A:是的,TableAdapter是.NETCompactFramework2.0中新增加的。

19、Q:SQLMobile带有像SQLServer那样企业管理器吗?VisualStudio2005支持在桌面上直接查看SQLMobile的数据库吗?

  A:您可以通过SQLServer2005的企业管理器连接到SQLMobile数据库进行编辑。VisualStudio2005也支持在桌面上创建或修改SQLMobile数据库文件。

20、Q:提交成功后如何取消保存?

  A:目前BindingSource尚不支持事务,因此提交成功后是没有办法再undo的。

21、Q:移动设备内存较小,填充DataSet是否有大小限制?

  A:DataSet在逻辑上并没有对大小的限制。但是DataSet的大小必须小于当前前的可用内存,否则会有内存分配不成功的异常出现。

22、Q:如果数据源中的数据在显示前需要处理(例如格式转换),可以使用DataBinging吗?

  A:BindingSource是直接将DataSet与控件进行关联,所以如果需要进行其他操作的话,就不能使用BindingSource。或者,可以在访问数据库后,先在DataSet里对需要转换的数据进行必要的处理之后,再进行显示。

23、Q:DataSet实际上在内存中产生了一套数据副本,如何解决版本控制的问题?

  A:DataSet本身不存在版本控制的问题。在把数据提交回SQLMobile的时候,的确需要有一些机制来保证修改完成的数据应该是最新的,但是DataSet本身的数据结构是不会发生变化的。

24、Q:能否通过PocketPC上的程序更新服务器上的数据库信息?

  A:可以。可以使用SQLMobile中的RDA或者是合并复制的方法和远程SQLServer数据库进行数据同步或更新。具体的实现可以参考SQLServer相关部分的文档。

25、Q:SQLMobile一定要要安装在移动设备上吗?

  A:是的。SQLMobile需要安装在WindowsMobile或者WindowsCE设备上。

26、Q:SQLMoble支持存储过程吗?

  A:目前还不支持。

27、Q:SQLMobile必须和应用程序部署在同一台设备上吗?可否远程连接?它是否是一个文本数据库?

  A:是的。SQLMobile必须和应用程序部署在同一个设备上,现在还不支持远程连接。SQLMobile是一个文件数据库,但不是一个文本数据库。

28、Q:能不能在一些应用中以XML替代SQL的作用?

  A:可以的。XML的查询效率比SQLMobile要低,但是在数据比较少的情况下不需要安装更多的组件,这是XML的一个优势。

29、Q:Tableadapter与DataAdapter之间有何区别?DataAdapter是多个TableAdapter的组合吗?

  A:不是的,TableAdapter是对DataAdapter的一个扩展,TableAdapter本身包括了对应数据表的信息。TableAdapter完成从数据库连接、执行SQL语句到将结果填充到DataSet中的一个完整操作,而DataAdapter只支持数据填充的操作。

30、Q:做了SQLMoblie的sdf文件后,Publications后的数据库表中会出现msrepl_tran_version或rowguid字段,这是为什么?

  A:这两个字段是为了保证数据同步,由系统自动添加的,请不要进行修改。

31、Q:网上出了个Reflector反编译工具,可以99%反编译用C#开发的EXE和DLL,怎么才能更好地保护应用程序?

  A:目前大部分应用程序采用混淆和对关键字符串加密的方式,更好的方式可能还要继续探讨。

(三)
1、Q:SQLMobile的SQL语法和SQLServer的语法有差异么?

  A:SQLMobile的语法和SQLServer的语法略有差异,可以从SQLMobile的文档中查找SQLMobile具体支持哪些SQL语句。总的来说,对绝大部分的开发来说,这些差异不会造成影响。

2、Q:SQLMobile支持B/S模式吗?

  A:不支持。

3、Q:可以在.NETCompactFramework1.0上访问由.NETCompactFramework2.0产生的数据库吗?

  A:SQLMobile数据库的格式和SQLServerCE2.0是相同的,因此可以直接在.NETCompactFramework1.0中进行访问。

4、Q:SQLMobile数据库文件支持XCOPY吗?可以简单地复制到其他WindowsMobile设备上吗?

  A:是的。SQLMobile数据库本身是一个文件数据库,直接复制到其他安装了SQLMobile支持组件的WindowsMobile设备或模拟器上就可以使用了。

5、Q:VisualStudio.NET2003是否支持WindowsMobile5.0的开发?

  A:不可以,如果开发基于WindowsMobile5.0的应用程序请使用VisualStudio2005。

6、Q:要想从传统的PC程序员转向到移动设备的开发上来,需要在技术上作哪些准备?

  A:移动设备的开发对于基础开发语言和开发技术的要求与PC上是相同的,只需要了解移动设备在哪些方面与PC平台有所不同即可。

7、Q:C#可以开发WindowsMoblie应用程序吗?

  A:可以。

8、Q:如果获取.NETCompactFramework2.0的安装程序并将其安装到WindowsMobile5.0设备中?

  A:VisualStudio2005提供了.NETCompactFramework2.0安装程序,在开发部署时会自动部署到移动设备上。

9、Q:WindowsMobile5.0中没有集成.NETCompactFramework2.0,是不是生成的应用程序安装包就应该带上.NETCompactFramework2.0?

  A:技术上来说是的。但能否在应用程序中提供.NETCompactFramework2.0取决于微软对此的授权情况。

10、Q:如何把.NETCompactFramework2.0与应用程序一同打包发布?

  A:.NETCompactFramework2.0有一个单独的CAB安装包,可以把此文件与应用程序打成一个安装包。

11、Q:用VisualStudio2003开发可以获得很好的兼容性吗?

  A:用VisualStudio2003开发的基于.NETCompactFramework2.0的程序可以在WindowsMobile5.0的设备上运行。

12、Q:在WindowsMobile上面是否开发COM+或者DLL?

  A:可以开发DLL动态共享库。

13、Q:C#是否支持WindowsMobile5.0的DirectX开发?

  A:支持。

14、Q:现有的使用VisualStudio开发的Smartphone2003应用程序,可以移植到WindowsCE5.0平台上吗?

  A:可以。

15、Q:WindowsMobile5.0内置红外线接口API吗?

  A:WindowsMobile5.0对红外接口的支持并没有更新,需要采用之前的方法进行红外接口的开发,例如与串口通信等。

16、Q:如何开发手机游戏,特别是能够交互的网络游戏?

  A:WindowsMobile对游戏开发的支持是比较充分的,可以采用DirectX技术进行3D或2D界面的开发;对于网络部分,WindowsMobile可以支持socket通信方式。所以,从技术上来讲,开发网络游戏是完全没有问题的。

17、Q:我们公司目前更多关注的是嵌入式领域,也就是WindowsCE,而非WindowsMobile。我们主要是在关注IPTV领域,在这方面有哪些的资源?

  A:WindowsCE是一种可自定义的嵌入式操作系统,适用于各种内存很少的设备。OEM可以使用WindowsCE设计平台和自定义应用程序,使用户可以获得各种设备的最佳体验,例如手持设备、瘦客户机、逻辑控制器以及各种高级消费类电子产品。WindowsMobile是基于WindowsCE构建的一种完善的软件平台。与WindowsCE不同,WindowsMobileSmartphone和PocketPC操作系统专为要求特殊硬件配置的设备而设计。该软件包括标准化的接口和应用程序,可确保在各种硬件设计中的兼容性。所以WindowsMobile和WindowsCE的资源是通用的,您可以在http://www.microsoft.com/china/mobile、http://www.microsoft.com/windowsmobile/,以及微软社区http://www.microsoft.com/china/windowsmobile/communities/default.mspx获得相应的资源和帮助。

18、Q:我们在WindowsMobile上进行应用开发遇到一些底层的接口问题,如何取得微软的技术支持?

  A:微软将一如既往地对基于WindowsMobile操作系统开发的独立软件开发商和开发人员进行支持,可以直接向800-820-3800全球技术支持中心寻求支持,或者提供具体问题细节,我们将给出相应的解决方案。

19、Q:如何才能将我们的软件放到微软的Mobile2Market项目中去?对MVP有没有什么优惠?

  A:Mobile2Markert项目在中国是非常优惠的,目前对MVP没有特别优惠。另外,如何将软件放到微软的Mobile2Market中请参考http://www.microsoft.com/china/mobile/developer/developerprograms/mobile2market/default.asp。

20、Q:哪些工具可用于PocketPC2003开发?

  A:要构建PocketPC2003本机C++应用程序,您需要MicrosofteMbeddedVisualC++4.0、MicrosofteMbeddedVisualC++4.0ServicePack3,以及PocketPC2003SDK。

21、Q:为了支持WindowsMobile2003SecondEdition的增强功能(例如高分辨率或横向屏幕),应该在应用程序中做些什么?

  A:WindowsMobile2003SecondEdition提供了全新的屏幕方向和分辨率,包括针对PocketPC的横向、方形和VGA支持以及针对Smartphone的QVGA支持。这种版本不需要新的SDK。

22、Q:PocketPC2002应用程序可以在PocketPC2003设备上工作吗?

  A:使用文档化API且功能良好的PocketPC2002应用程序无需重新编译即可在PocketPC2003设备上运行。

23、Q:如何从eVB迁移到VisualBasic.NET?

  A:从eVB迁移到VisualBasic.NET并不容易,但迁移的好处远远超过了成本:?数据类型更丰富:eVB只有16字节的VARIANT;VisualBasic.NET使用.NETFramework通用类型系统。?执行更快:eVB需要解释;VisualBasic.NET在执行前由JIT(实时)编译器编译为本机代码。?错误处理更完善:eVB仅支持“OnError”;VisualBasic.NET支持结构化异常处理。?支持结构:eVB不支持;VisualBasic.NET支持命名空间、类和结构。?面向对象:eVB是面向过程的;VisualBasic.NET支持完全的OOP(面向对象编程)。?“一等公民”:eVB总是希望迎头赶上MFC;VisualBasic.NET则是.NET的核心。?本机XML支持:eVB不支持;VisualBasic.NET支持本机XML和XMLWeb服务。?数据模型更完善:ADO.NET远远超过了ADOCE;它是最好的数据模型。?执行更安全、更可靠:eVB是一种脚本语言;VisualBasic.NET为托管代码。?还有许许多多!同时,还有各种各样的资源(从移植实验到技术文章)可以帮助开发人员进行这种过渡。

24、Q:应该使用什么开发工具来编写基于.NETCompactFramework的PocketPC应用程序?

  A:MicrosoftVisualStudio.NET2003允许VisualBasic.NET或C#编程人员创建PocketPC2000、PocketPC2002和PocketPC2003设备的托管代码应用程序(即那些以.NET公共语言运行库为目标的应用程序)。要开发PocketPC2000和PocketPC2002设备的托管代码应用程序,您可以使用即装即用的VisualStudio.NET2003。在开发过程中,VisualStudio.NET2003将会自动地将.NETCompactFramework安装到这些设备的RAM中。.NETCompactFramework已经在所有PocketPC2003设备的ROM中,而且VisualStudio.NET2003通过PocketPC2003SDK支持它。

25、Q:有什么资源可以用于进行WindowsMobile2003SecondEdition的开发?

  A:下载新的WindowsMobileDeveloper资源包,其中包括白皮书以及新的和更新的代码示例。该版本不需要全新的SDK。可以用新的模拟器软件包对应用程序进行测试。eMbeddedVisualC++4.0开发人员应当下载eMbeddedVisualC++4.0ServicePack3。

26、Q:什么工具可用于Smartphone2002开发?

  A:要开始开发MicrosoftSmartphone2002应用程序,您需要eMbeddedVisualC++3.0和Smartphone2002SDK。两者都可以在WindowsMobileDeveloper获得。

27、Q:MFC或ATL可用于Smartphone2002开发吗?

  A:不可以,Smartphone2002不支持MFC与ATL开发。

28、Q:可以使用eMbeddedVisualBasic3.0来构建Smartphone2002应用程序吗?

  A:不可以,不支持以Smartphone2002为目标的eVB开发。

29、Q:哪些工具可用于进行MicrosoftSmartphone2003开发?

  A:对于Smartphone2003,有两种开发选择,或者通过带有ServicePack3的eMbeddedVisualC++4.0开发本机代码,或者通过VisualStudio.NET2003开发托管代码。这两种情况都需要下载Smartphone2003SDK。WindowsMobile2003SecondEdition模拟器软件包使您可以在SecondEdition设备上测试应用程序。eMbeddedVisualC++4.0和Smartphone2003SDK都可以在WindowsMobileDeveloper获得。

(四)
1、Q:在Smartphone 2003上可以使用.NET Compact Framework的哪一个版本?

A:Smartphone 2003允许开发人员使用.NET Compact Framework 1.0 Service Pack 1进行编码。.NET Compact Framework可以放在Smartphone 2003的ROM中。.NET Compact Framework 1.0 Service Pack 2放在Smartphone 2003 Second Edition的ROM中。

2、Q:什么是示例Smartphone 2002设备和Smartphone 2003设备?

A:原始的Orange SPV与Orange SPV e100运行Windows Mobile 2002。Orange和AT&T上的MPX200都是基于Windows Mobile 2002的Smartphone。Orange SPV e200运行Windows Mobile 2003。

3、Q:MFC或ATL可用于Smartphone 2003开发吗?

A:MFC不可用于Smartphone 2003。可以使用ATL 4.0进行Smartphone 2003开发。有关ATL 4.0的更多信息,请参阅SDK文档。

4、Q:从哪里可以找到更多有关Smartphone应用程序安全模型的信息?

A:为了帮助开发人员了解基于Windows Mobile的Smartphone应用程序安全模型,我们创作了一本白皮书。请参见http://msdn.microsoft.com/library/en-us/dnsmtphn2k3/html/smartphone_security.asp。

5、Q:可以使用eMbedded Visual Basic 3.0来构建Smartphone 2003应用程序吗?

A:不可以,不支持以Smartphone 2003为目标的eVB开发。如果您希望利用Visual Basic的开发技巧,可以考虑使用Visual Basic .NET并以.NET Compact Framework为目标。

6、Q:什么是Microsoft eMbedded Visual Tools 3.0?

A:eMbedded Visual Tools 3.0是一种集成开发环境(IDE),用来为基于Microsoft Windows CE操作系统的32位设备编写软件应用程序。其中包括完整版的Microsoft eMbedded Visual C++ 3.0语言、Microsoft eMbedded Visual Basic 3.0语言、特定于平台的SDK、远程工具和文档。

7、Q:eMbedded Visual Tools 3.0支持哪些设备平台?

A:eMbedded Visual Tools 3.0 - 2002 Edition附带于Pocket PC 2000、Pocket PC 2002和Smartphone 2002的SDK,并支持开发自定义的Windows CE 3.0设备应用程序。注:Pocket PC 2002 SDK可以与eMbedded Visual Basic 3.0和eMbedded Visual C++ 3.0一起使用,但是Smartphone 2002 SDK却只受eMbedded Visual C++ 3.0 支持。

8、Q:什么是eMbedded Visual C++ 4.0?

A:eMbedded Visual C++ 4.0是一种强大的开发工具,在为下一代基于Windows CE的设备(包括Pocket PC 2003和Smartphone 2003)构建本机代码应用程序时可以为企业提供相当大的好处。这种独立的集成开发环境(IDE)带来了新水平的Windows CE开发效率,但却没有牺牲灵活性、性能或控制能力。要使用eMbedded Visual C++工具构建Pocket PC 2003与Smartphone 2003应用程序,还需要安装eMbedded Visual C++ 4.0 Service Pack 3和Pocket PC 2003以及Smartphone 2003 SDK。

9、Q:我可以使用eMbedded Visual C++ 4.0开发Pocket PC或Smartphone应用程序吗?

A:可以使用带有Service Pack 2的eMbedded Visual C++ 4.0来开发包括Windows Mobile 2003 Second Edition在内的Pocket PC 2003与Smartphone 2003应用程序。也可以用它来开发Pocket PC 2002或Smartphone 2002应用程序。

10、Q:我可以使用Windows CE Standard SDK开发Pocket PC或Smartphone应用程序吗?

A:Windows CE SDK提供了一个通用的功能子集,使得编写的应用程序能够符合Standard SDK,以便运行在基于自定义显示的Windows CE .NET平台上。为了构建Pocket PC和Smartphone智能设备应用程序来利用这些平台提供的丰富的设备功能集,需要使用特定于设备的SDK。

11、Q:eMbedded Visual Tools 3.0和Visual Studio .NET之间有什么不同?

A:eMbedded Visual Tools 3.0是一种专门针对移动与嵌入式技术开发人员的独立开发环境。对于Pocket PC和Smartphone,都可以利用eMbedded Visual Tools和适当的平台SDK来构建丰富的“本机代码”客户端应用程序。Visual Studio .NET是Microsoft的最流行桌面开发工具的最新版本。可以使用Visual Studio .NET 2003来构建基于.NET Compact Framework的Pocket PC智能客户端应用程序。同时,还可以使用Visual Studio .NET和ASP.NET移动控件构建以各种设备(包括Pocket PC和Smartphone类别的设备)为目标的基于浏览器的应用程序。

12、Q:为什么没有将eMbedded Visual C++集成到Visual Studio .NET中?

A:根据客户的反馈,我们最初的工作主要集中于使Visual Basic .NET开发人员能够更轻松地对设备进行编程。但是,利用本机代码(C++)创建设备应用程序的功能将会集成到Visual Studio的下一个版本中。

13、Q:什么是.NET Compact Framework?

A:.NET Compact Framework是.NET Framework的子集,设计为能运行在资源受限的设备上,以便为托管代码和XML Web服务提供支持。.NET Compact Framework大大降低了编写运行在诸如Pocket PC设备上的应用程序和服务的开发成本。由于.NET Compact Framework是开发人员用来编写桌面和服务器应用程序的.NET Framework的一个子集,所以他们已经具备了编写Pocket PC和Smartphone 2003设备应用程序所必需的全部技巧。

14、Q:使用.NET Compact Framework的主要好处是什么?

A:目前编写设备应用程序的一个最大障碍在于,大多数设备都要求开发人员了解不同的API和使用不同的编程工具(与用于桌面应用程序相比)。由于.NET Compact Framework使用的.NET Framework编程模型和Visual Studio .NET开发工具与开发人员已经在桌面和服务器上使用的相同,所以它可以大大降低开发设备应用程序的成本,并提高开发人员的工作效率。而这些好处又能够使企业以新的方式使用智能设备,从而改进他们的业务。.NET Compact Framework也是唯一带有XML Web服务本机支持的移动开发平台。

15、Q:什么设备可以运行.NET Compact Framework?

A:NET Compact Framework 1.0可以用作Pocket PC 2000和Pocket PC 2002设备(包括Phone Edition)的RAM安装,并且可以放在Pocket PC 2003的ROM中。Smartphone 2003设备包含.NET Compact Framework 1.0 Service Pack 1。所有的Windows Mobile 2003 Second Edition设备均包含.NET Compact Framework 1.0 Service Pack 2。

16、Q:何时可以使用.NET Compact Framework?

A:.NET Compact Framework的1.0版可以作为Visual Studio .NET 2003版本的一部分使用。有关更多信息,请参阅Device Development。

17、Q:.NET Compact Framework可以运行所有的.NET语言吗?

A:最初,.NET Compact Framework可以运行Visual C#和Visual Basic。只要其他.NET语言符合.NET Compact Framework支持的公共语言运行库子集,它们就可以运行。

18、Q:.NET Compact Framework应用程序和eMbedded Visual C++应用程序的执行情况一样吗?

A:在大多数情况下,用eMbedded Visual C++编写的应用程序的运行速度比用Visual Basic .NET或Visual C# .NET编写的应用程序快。但是,对于应用程序计算密集的部分,开发人员将会看到他们的Visual Basic .NET应用程序比他们的eMbedded Visual Basic应用程序有实质性的改善。

19、Q:.NET Compact Framework与ASP.NET移动控件之间有什么不同?

A:对设备进行编程有两种不同的方法。一种方法是将应用程序放置在智能设备上。另一种方法是将代码放置在服务器上,并通过浏览器呈现用户界面。.NET Compact Framework支持前者,而ASP.NET移动控件(以前称为Microsoft Mobile Internet工具包)则支持后者。使用设备上的代码构建移动应用程序使应用程序在没有Internet连接的情况下可以继续工作。直接在设备上运行的应用程序还支持更丰富的用户界面,以及与操作系统上的可用资产(例如多媒体和其他的应用程序)进行集成的可能性。可以使用.NET Compact Framework将高效模型用于构建智能设备应用程序。构建代码位于服务器的移动应用程序也有其优点。在必须使用Internet支持的各种移动设备时,这种体系结构非常有用。这些应用程序也不受资源的限制,因为它们作为桌面Web应用程序运行在相同的服务器上。在Visual Studio .NET中使用ASP.NET移动控件可以完成这些应用程序的编写。

20、Q:Visual Studio .NET 2003和Visual Studio 2005开发的Mobile在部署(方法和平台)上面有什么具体的不同?

A:从Visual Studio 2005 beta版的情况来看,和Visual Studio .NET 2003的部署过程是相同的。在开发方面,Visual Studio 2005直接提供了Skin功能,可以使开发者在设计界面时能够更加直观。并且在调试时,其调试环境不再是在模拟器环境当中,而直接使用本地计算机的资源,调试速度更快。

21、Q:我想使用GPS采集数据,然后将数据实时显示在客户机屏幕上,采用什么连接方式比较好?

A:数据连接的方式主要取决于GPS的类型。目前GPS接收器有两种方式,串口或USB连接和蓝牙连接。如果是串口和USB连接,你可以使用CreateFile或者OpenNETCF中的串口类进行操作;而蓝牙设备,就需要使用Windows CE的Bluetooth API了。

22、Q:怎样生成一个像PC上Setup一样的安装程序在Pocket PC上来完成安装工作?

A:Windows Mobile设备的标准安装文件是CAB格式的。您可以在Visual Studio.NET中选择“生成CAB文件”,或者直接使用命令行工具cabwiz生成CAB文件。

23、Q:用Windows Mobile把一个XML传入Web Service,处理后返回一个XML。传入的XML可有多种形式,请问共有哪几种写法?他们有什么区别?例子:1.public XmlDo***ent GetXml(XmlDo***ent xmlfile);2.public XmlElement GetXml(XmlElement xmlfile)...返回的XML其实是个SOAP消息,如何去掉SOAP?

A:1)建议传递参数直接传递XML格式的字符串而不要传递对象。2)Web Service传递的信息中必定有SOAP消息,如果只想传递XML实体内容的话,建议通过Http请求直接POST数据,然后返回订制好的XML格式的实体数据。

24、Q:XML数据内容的安全性如何?与SQL CE相比哪个效率更高些呢?

A:1)XML的数据内容本质上就是纯文本,没有安全性可言。要实现安全性,您可以通过一些别的加密手段对内容进行加密。2)相比来说,在处理大数据量的时候SQL CE的处理速度要比直接处理XML快一些。

Pocket PC的游戏编程指导

第一章:工具
在Pocket PC上编写游戏首先需要的就是微软的“eMbedded Visual Tools 3.0”。它是可以免费下载的(省略),但文件大小超过300M,所以请选择适当的时候下载(用28.8K的Modom需要大约30个小时)。你也可以在软件零售商店买到它的CD-ROM版本。请访问微软的网站来获取更多的信息。

eMbedded Visual Tools包含C和C++的编译器,链接器,C和Windows的标准库,标准的包含文件,集成开发环境,模拟器,帮助文件和开发工具。其中最大的就是这个开发包的基础知识库——MSDN。推荐在Windows NT或Windows 2000上安装使用。因为模拟器无法在除此之外的操作系统上工作。

因为Windows CE被设计成可以支持不同种类的CPU,如StrongARM、MIPS、SH3、SH4和X86。它也支持不同的设备,例如手持设备,口袋设备或者是移动电话。但是在将来,我们或许会在住宅电话、电视、微波炉等设备上见到它,当然,其他设备也都有可能。

我们可以把EVC分成三个重要的部分:IDE(集成开发环境),各种CPU平台的开发包和ActiveSync。

这个EVC的集成开发环境有些类似Microsoft Visual Studios的集成开发环境。你还需要安装各种平台的开发包和支持每个平台的特定文件(微软也提供这些平台的构建开发包,供你开发你自己的Windows CE设备)。安装程序将询问你是否安装其他开发平台,如HPC、PsPC和PPC。如果你不打算开发其他设备的软件,你可以不安装它们。当然,这个方法可以使你用这个工具开发其他Windows CE设备的程序,你所需要做的只是安装这个平台的开发包。

ActiveSync让你和你的设备通信。它的功能是最基本的。它支持所有的设备。

当你将EVC安装到你的台式电脑后,你就可以为你的CE设备开发软件了,包括可执行文件、动态链接库(DLL)、设备驱动程序ActiveX应用程序等等。当然,游戏可能回会用到其中的两种,那就是可执行文件和动态链接库。我们将在下一章学习怎么创建它们。

如果你更喜欢DOS环境,你可以使用旧的开发方式,使用你自己的文本编辑器,用make在命令行下编译链接程序。这个文件通常位于:

编译和链接器 (for PPC)位于

安装目录/Microsoft eMbedded Tools/Evc/Wce300/bin

库和包含文件位于

安装目录/Windows CE Tools/wce300/MS Pocket PC/lib
安装目录/Windows CE Tools/wce300/MS Pocket PC/include

另外一些重要的文件是支持文件,当你想安装程序,在和设备台式电脑间交换数据或捕捉屏幕,将会用到它们。
要学习如何使用EVC,你可以阅读在线帮助或者只是阅读本文,但我无法让你学会有关EVC的所有知识,因为我在试图指导你达到另外一点,那就是让你学会开发你自己的游戏程序。

  

  

第二章:操作系统接口

这一章主要的目标是使你的程序能够在机器上运行。当然,我们需要遵守操作系统规则。那么我们怎样创建一个应用程序呢?

这里有一段很短的代码,它可以在你的Pocket PC上运行。
#include "windows.h"
  LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM   lParam)
  {
            if(message == WM_LBUTTONDOWN)
      {
              DestroyWindow(hWnd);
                  return 0;
          }
          return DefWindowProc(hWnd, message, uParam, lParam);
  }
  int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPTSTR lpCmdLine, int nCmdShow)
  {
          WNDCLASS wc;
          memset(&rc,0,sizeof(wc));
          wc.style = CS_HREDRAW|CS_VREDRAW;
          wc.lpfnWndProc = (WNDPROC) MainWndProc;
          wc.hInstance = hInstance;
          wc.hbrBackground = GetStockObject(WHITE_BRUSH);
          wc.lpszClassName = L"myapp";
          if(RegisterClass(&wc))
          {
                  HWND hWndMain;
                  if(hWndMain = CreateWindow(L"myapp",L"Hello",
                  WS_VISIBLE,0,0,240,320,0,0,hInstance,0))
                  {
                          MSG msg;
                          ShowWindow(hWndMain, SW_MAXIMIZE);
                          UpdateWindow(hWndMain);
                          while(GetMessage(&msg,hWndMain,0,0))
                                  DispatchMessage(&msg);
                          return msg.wParam;
                  }
          }
          return 0;
  }
              
好了,它可以运行了,它将显示一个空白的屏幕,并且在你点击屏幕后结束。如果你是刚刚学习编程,而且从来没有使用过EVC或是VC,你可以按照下面步骤操作:

执行EVC

选择FILE菜单的NEW...项

选择WCE Application并且点选你所需要的CPU平台

给你的工程命名,并且选择在硬盘中存放的目录。

单击OK按钮

接下来应用程序创建巫师询问你是要创建何种的应用程序,选择'An empty project'然后点机完成。随后工程信息对话框出现,点击OK进行下一步。

现在你得到了一个空的工程,如果要学习使用EVC的用户界面,请看看它的在线文档。现在,让我们为它添加第一个源文件。点击FILE菜单的NEW...项。新弹出的对话框将为你显示一些信息。

选择C++文件类型,点选'Add to project'检查框。在文件名编辑框内键入文件名,如'startup.c',然后按OK键。

一个新的空白文件将会出现供你编辑。

键入或复制上述代码到空白文件中,并且保存。

选择要编译的平台和CPU。然后按F7或从project菜单中选择build来编译、链接工程。对于iPaq,设定当前的激活平台为Pocket PC,设定CPU和编译模式为Win32 (WCE ARM) release.

在build之后。你的第一个应用程序保存在“ARMRel”的子目录中

通常,在没有差错的build完工程后。可执行文件将会自动被上传到你的Pocket PC中,如果它已经正确连接到你的台式电脑上。如果没有,你可以选择Build菜单中的Update Remote Output Files将它上传。当然你也可以通过ActiveSync或EVC自带的Remote File Viewer工具将它手动上传。

 这个应用程序将出现在你的开始菜单中。(注意,新建工程的默认上传位置是/Windows/Start menu目录,但中文版Pocket PC并不存在该目录,它对应的目录是/Windows/“开始”菜单,你要在必须要在Projet菜单的setting中设置,在弹出的对话框中选择Debug标签页,修改其中的Download directory内容为"/Windows/“开始”菜单")

在下面的章节中,我们将开始理解这些代码是如何工作的。

首先,我们需要告诉操作系统关于你的新的应用程序的信息。因为Win32是一个多任务的操作系统,所有运行的应用程序必须把自己的的信息存放在操作系统的内部数据库中。你需要填充一个WNDCLASS结构,通过使用RegisterClass这个系统API(应用程序接口),来将这些信息告诉操作系统。如果操作系统接受你的信息,这个函数返回一个非零值。

WNDCLASS结构中有三个参数比较重要,hInstance、lpszClassName和lpfnWndProc. “hInstance”是一个用来识别你应用程序的唯一的数字(或是进程ID).你将会从操作系统中得到这个值。我们将在程序的几个地方用到它。“lpszClassName”是当我们创建窗口时用来识别应用程序自己的唯一的字符串。最后的一个是“lpfnWndProc”。它是一个用来获得系统通知消息的函数名称。

其他的成员可以被设定为零,而且不会有任何错误。但是我们通常通过hbrBackground来设定窗口的背景颜色。如果这个成员不设定(也就是赋值为零),系统将不会填充窗口的客户区,而是给你发送WM_ERASEBKGND消息,然后由你自己来填充背静。

下面的步骤是创建主窗口。这里的“窗口”是指一个与其他运行中的应用程序共享着的显示区域。因为你的应用程序需要这个区域来显示正文(菜单条、标题栏、客户区等等)。它也被用来获得鼠标动作(鼠标移动、鼠标点击等等)。窗口是拥护和程序交互的途径,CreateWindow函数创建一个窗口(一个应用程序可以拥有一个或多个窗口)。这个窗口需要联系到刚才用RegisterClass注册的数据。它的第一个参数必须和WNDCLASS的lpszClassName成员一致。

如果函数成功了,它返回一个窗口的句柄(HANDLE),变量类型是HWND。这是一个唯一的32bit (双字)值,用来识别所创建的窗口。如果失败,它返回空(就是零值)。

创建的窗口并没有立即显示到屏幕上。这里有两个函数——ShowWindow和UpdateWindow,供你将窗口显示到屏幕上。通常Pocket PC的应用程序在它们运行时占据整个屏幕(因为Pocket PC的屏幕实在是太小了)。我总是使用代码以获得最大的屏幕显示区域。

接下来,程序进入一个循环。就是这个循环保证了多任务系统的工作。所有的系统消息通过DispatchMessage被发送到住窗口过程MainWndProc。循环将在窗口被DestroyWindow销毁或被系统终结后退出。退出循环后,程序被系统杀掉。你的应用程序信息也被自动移除。

有没有其他简单的方法让一个程序在Pocket PC上执行?当然有,那就是利用现有的窗口类来开始你的应用程序,因为你不需要注册一个新的窗口类。这样的代码将比本文介绍这个小。通常就是一个基于对话框的应用程序。我不打算讲这个方法,因为,这样将失去一些控制应用程序的方法,而且需要花更多的时间来学习Win32的资源脚本文件格式。
第三章:离屏技术(也就是我们常说的屏幕缓冲区)

导读

在我们学习离屏(OFF SCREEN)技术之前,让我们看看ON SCREEN是什么?为什么没有任何游戏程序使用这种方法?此外,还有另外一个基础问题,我们怎么在窗口的客户区绘制文字、图片或者是图画?

通常,在屏幕上显示任何东西的方法是使用GDIs(图形设备接口)和APIs(应用程序接口)。Windows的窗口区域被划分成两个重要部分:客户区和非客户区(比如菜单、标题栏和边界框)。大多数窗口是可以移动的。因此它所显示的内容也跟着窗口自己的左上角一起关联移动。GDIs和APIs帮助我们管理这种关联。

Windows的GDI是用来对所有硬件设备提供一种硬件无关支持的程序。因为各个厂家的硬件技术是不同的,所以用这些相同的代码是无法获得硬件的最大性能。实现它们的目的只是保证支持。然而,很多有些开发者想要获得硬件设备的最大性能,他们不用GDIs和APIs,而是直接访问硬件。当然这些方法也可以工作,但却依赖于使用的硬件,它们可能无法在全部的设备上工作。

Windows CE的显示技术又如何呢?有人都能改变显示适配器吗?当然不能,因为它是一种嵌入式系统。通常硬件厂商不会在系统中包含优化代码。然而,这种显示速度已经能够应付某些游戏类型了。

Windows GDIs

设备正文的句柄,通常表示为hDC,是一个连接GDI程序的32位的整数值。通常,大多数窗口有它自己的DC(设备文本),并且你可以通过它的hWnd(窗口句柄)获得它的DC。方法如下:
HDC hDC;
hDC = GetDC(hWnd);

要调用GDIs和APIs,例如画一条线,你需要将hDC作为这些GDI函数的第一个参数。

  MoveToEx(hDC,0,0,NULL); //将作图点移动到(0,0)
  LineTo(hDC,240,300); //从作图点画线到(240,300)
做完这些,你还必须要从内存中释放hDC

ReleaseDC(hWnd,hDC);

这里还有一个特殊的绘图工作,那就是在收到WM_PAINT消息时,这意味着系统要求你画出你的客户区域,这些代码通常在MainWndProc中完成。下面的代码就的功能就是在窗口的正中央显示文字"hello"。另外,在WM_PAINT消息处理中,除了GetDC,还有另一种更方便的从窗口获取hDC的方法,那就是BeginPaint和EndPaint。

  LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam)
  {
            PAINTSTRUCT ps;
          HDC hDC;
          RECT rcClient;
          switch(message)
          {
                  case WM_PAINT:
                            hDC = BeginPaint(hWnd,&ps);
                          GetClientRect(hWnd,&rcClent);
                          DrawText(hDC,L"Hello",5,
                          &rcClient,DT_CENTER|DT_VCENTER);
                          EndPaint(hWnd,&ps);
                          break;
                  case WM_LBUTTONDOWN:
                          DestroyWindow(hWnd);
                          break;
                  default:
                          DefWindowProc(hWnd, message, uParam, lParam);
          }
          return 0;
  }
这些代码中GetClientRect用来获得整个客户区域的矩形范围,DrawText用来在屏幕上这个举行范围的中心画出文字"hello"。

当然我们也可以在别的地方进行绘制,你可以再试试下面这些代码。

LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam)
{
HDC hDC;
int nXpos;
int nYpos;

switch(message)
{

case WM_LBUTTONDOWN:
nXpos = LOWORD(lParam);
nYpos = HIWORD(lParam);
hDC = GetDC(hWnd);
MoveToEx(hDC,nXpos-4,nYpos-4,NULL);
LineTo(hDC,nXpos+4,nYpos+4);
MoveToEx(hDC,nXpos+4,nYpos-4,NULL);
LineTo(hDC,nXPos-4,nYpos+4);
ReleaseDC(hWnd,hDC);
break;

case WM_KEYDOWN:
DestroyWindow(hWnd);
break;

default:
DefWindowProc(hWnd, message, uParam, lParam);
}

return 0;
}
上面这种直接在屏幕(设备文本)上绘图的方法,就叫做ON SCREEN。在下面,我将给你演示为着这种方法不适合运用在游戏程序中。让我们看看下面这些长一些的代码。

static HBRUSH hbrRed;
static HPEN hpeBlue;

static void _drw_object(HDC hDC, int nX, int nY)
{
HGDIOBJ hOldPen, hOldBrush;

hOldPen = SelectObject(hDC,hpeBlue);
hOldBrush = SelectObject(hDC,hbrRed);
Ellipse(hDC,nX-20,nY-20,nX+20,nY+20);
SelectObject(hDC,hOldBrush);
SelectObject(hDC,hOldPen);
}

LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam)
{
HDC hDC;

switch(message)
{
case WM_LBUTTONDOWN:
hDC = GetDC(hWnd);
_drw_object(hDC,LOWORD(lParam),HIWORD(lParam));
ReleaseDC(hWnd,hDC);
break;

case WM_MOUSEMOVE;
hDC = GetDC(hWnd);
PatBlt(hDC,0,0,240,320,WHITENESS);
_drw_object(hDC,LOWORD(lParam),HIWORD(lParam));
ReleaseDC(hWnd,hDC);
break;

case WM_LBUTTONUP:
hDC = GetDC(hWnd);
PatBlt(hDC,0,0,240,320,WHITENESS);
ReleaseDC(hWnd,hDC);
break;

case WM_CREATE:
hbrRed = CreateSolidBrush(RGB(255,0,0));
hpeBlue = CreatePen(0,0,RGB(0,0,255);
break;

case WM_DESTROY:
DeleteObject(hbrRed);
DeleteObject(hpeBlue);
PostQuitMessage(0);
break;

case WM_KEYDOWN:
DestroyWindow(hWnd);
break;

default:
DefWindowProc(hWnd, message, uParam, lParam);
}

return 0;
}
现在,试试用笔点击屏幕并在拖动看看。

计算机将首先将屏幕填充为白色,将原本的圆形物体擦除,然后在新的位置画上。因为填充屏幕要画掉很多的时间,因此我们将看到旧有图形被长时间的擦除,然后新图形在别的位置出现。这个过程就在我们的眼睛中形成了闪烁。如果有多个需要绘制的物体,这种闪烁将更加明显。

离屏技术

离屏技术的优点就恰恰是避免屏幕的闪烁。它的方法就是:创建一个隐藏的屏幕,一个虚拟的屏幕,或者是在可显区域外的屏幕。然后,我们将所要画的任何东西都先画在这个屏幕上。在这个期间,真正的屏幕是不会变化的。当绘制结束后,在再将整个虚拟屏幕上的内容拷贝到真正的屏幕,因为这个时间很短,内容变化不大时,几乎看不到任何闪烁。

现在,就让我们看看它是如何在Pocket PC上实现的?有三个重要的步骤:

1. 创建离屏的虚拟屏幕。
2. 在离屏虚拟屏幕上绘图。
3. 将离屏虚拟屏幕的内容拷贝到真正的屏幕。


static HBRUSH hbrRed;
static HPEN hpeBlue;

static HDC hOffscreenDC;
static HBITMAP hOffscreenBuffer;
static int nOffscreenCX, nOffscreenCY;

//创建离屏表面
void InitOffscreen(int nWidht, int nHeight)
{
HDC hDesktopDC;

//获取桌面的设备文本
hDesktopDC = GetDC(0);
//创建和桌面相同的设备文本,也就是虚拟屏幕的设备文本
hOffscreenDC = CreateCompatibleDC(hDesktopDC);
//创建和桌面相同的位图(缓冲内存)
hOffscreenBuffer = CreateCompatibleBitmap(hDesktopDC,nWidth,nHeight);
//将内存缓冲选入虚拟屏幕的设备文本
SelectObject(hOffscreenDC,hOffscreenBuffer);
nOffscreenCX = nWidth;
nOffscreenCY = nHeight;
//释放桌面的设备文本
ReleaseDC(0,hDesktopDC);
//将整个屏幕画为白色
PatBlt(hOffscreenDC,0,0,nWidth,nHeight,WHITENESS);
}

//释放离屏表面
void DeinitOffsceen(void)
{
//释放虚拟屏幕的设备文本
DeleteDC(hOffscreenDC);
//删除虚拟屏幕的内存对象
DeleteObject(hOffscreenBuffer);
}

//更新屏幕(将离屏虚拟屏幕的内容拷贝到真正的屏幕)
void UpdateDisplay(HWND hWnd)
{
HDC hDC;

hDC = GetDC(hWnd);
//将虚拟屏幕位块传送到窗口hDC的屏幕上
BitBlt(hDC,0,0,nOffscreenCX,
nOffscreenCY,h0ffscreenDC,0,0,
SCRCPY);
ReleaseDC(hWnd,hDC);
}

//绘制圆形物体
static void _drw_object(HDC hDC, int nX, int nY)
{
HGDIOBJ hOldPen, hOldBrush;

hOldPen = SelectObject(hDC,hpeBlue);
hOldBrush = SelectObject(hDC,hbrRed);
Ellipse(hDC,nX-20,nY-20,nX+20,nY+20);
SelectObject(hDC,hOldBrush);
SelectObject(hDC,hOldPen);
}

//窗口过程
LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM uParam, LPARAM lParam)
{
switch(message)
{
case WM_LBUTTONDOWN:
_drw_object(hOffscreenDC,LOWORD(lParam),HIWORD(lParam));
UpdateDisplay(hWnd);
break;

case WM_MOUSEMOVE;
PatBlt(hOffscreenDC,0,0,240,320,WHITENESS);
_drw_object(hOffscreenDC,LOWORD(lParam),HIWORD(lParam));
UpdateDisplay(hWnd);
break;

case WM_LBUTTONUP:
PatBlt(hOffscreenDC,0,0,240,320,WHITENESS);
UpdateDisplay(hWnd);
break;

case WM_CREATE:
hbrRed = CreateSolidBrush(RGB(255,0,0));
hpeBlue = CreatePen(0,0,RGB(0,0,255);
InitOffscreen(240,320);
break;

case WM_DESTROY:
DeleteObject(hbrRed);
DeleteObject(hpeBlue);
DeinitOffscreen();
PostQuitMessage(0);
break;

case WM_KEYDOWN:
DestroyWindow(hWnd);
break;

default:
DefWindowProc(hWnd, message, uParam, lParam);
}

return 0;
}


这些代码显示了一个以GDI为基础的离屏表面,它是怎么工作的呢?

让我们解释这些代码,InitOffscreen函数中,使用简单的GDIs和APIs——CreateCompatibleDC和CreateCompatibleBitmap创建一个虚拟屏幕。

DC,也就是设备文本,是一种调用设备例程(或者是设备驱动例程)的方法。因为我已经在前面的Windows的GDIs部分大概介绍了它,这里我们来学习更多有关它的其他方面。设备文本也有三个主要的类型:它们是显示设备文本、打印设备文本、和内存设备文本。如果我们在打印文本上画线,设备文本将会调用打印机驱动程序中的画线程序来完成这一过程。如果是在显示文本上画线,调用的自然也就是显示驱动程序中的例程。如:

  hDC = CreateDC("Printer",0,0,0); // 创建缺省的打印文本
  hDC = CreateDC("Display",0,0,0); // 创建的显示文本
  hDC = GetDC(hWnd); // 获得窗口客户区的显示文本
  hDC = GetWindowDC(hWnd); // 获得整个窗口的显示文本(包含非客户区)

换句话说,GDIs可以理解为是一个通过DC选择器来实现的硬件设备的通路。这个通路可以让你以共同的方法控制图形设备,包含一些非原始的设备。

要了解更多有关Windows图形设备接口(GDI)的和设备驱动的概念,请参考MSDN。

而什么是内存设备文本呢?可以这么说,它就是虚拟屏幕!CompatibleDC函数创建一个和源设备文本一致的新的设备文本,但它只存在于内存中,并不关联设备。下一步,我们需要分配一个内存块,也就是用来储存图象的屏幕缓冲区。Windows的位图对象就是实现这个的一种方法。我们可以用CreateCompatibleBitmap来创建一个和屏幕相同象素位数,相同颜色格式、相同调色板数目的位图,通过SelectObject将它选入内存设备文本。这样,一个离屏的虚拟屏幕就建成了。

之后,内存设备文本就可以象普通的显示设备文本一样使用了,我们可以将它用在各种GDIs和APIs中,在它上面做图,将它画到其他设备文本上,等等。如,在UpdateDisplay中,我们就用位块传送函数BitBlt将它拷贝到了窗口的客户区域。这个函数在各种设备文本上以相同的形式,非常快速的复制以矩形区域为单位的数据。

在例子程序中,WM_CREATE消息只是在我们的主窗口在内存中被创建时,发送到我们的窗口函数,在整个程序的生存周期内只有一次,因此适合做一些初始化的工作。而WM_DESTROY消息则在窗口别销毁时被发送,可以放入对应内存释放的工作。而WM_MOUSEMOVE
、WM_LBUTTONDOWN和WM_LBUTTONUP是鼠标事件消息。我们将在笔尖接触屏幕、笔尖移过屏幕和笔尖离开屏幕时分别收到它们。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页