新闻  |   论坛  |   博客  |   在线研讨会
如何编写WindowsCE结构的应用程序
yanqin | 2009-04-16 19:35:49    阅读:1617   发布文章

如何编写Windows CE结构的应用程序  
%A   
%A 作者:ZDNet   来源:ZDNet.com   时间:2003年4月15日 13:20   阅读5648次  
%A   
%A   
%A 在上一章节里,我已经为如何编写真正意义上的Windows CE应用程序做好充分的准备。在本节中,我将继续深入这一主题。
%A
%A 我选择编写的这一应用程序,虽然相对简单,但你却可以从中知道怎么去编写比较复杂的程序(比“Hello World.”复杂)。这一应用程序包括属性页和属性表,即所说的TAB控件,它含有自定义的图标和跳格符,能把参数选择保存到注册表中。
%A
%A 程序开发的一个关键之处是保持和微软用户界面相一致的特性。在开发过程中我尽可能的采用了微软的应用程序的字体和布局,商业开发人员更应该为他们的Windows CE应用程序设计出优美的界面。
%A
%A 获取代码  
%A 可以从这里下载这一例程的源代码
%A
%A 类结构
%A 所有的代码加起来也有几千行,共分为5个文件。我选择用微软基础类库(MFC)来实现,软件也具有很好的扩展性,如图A所示。
%A
%A Figure A
%A
%A
%A
%A 类结构
%A
%A CCNETConfig:这是程序的主线程,它起动与注册表的连接,建立与CPageTab1, CPageTab2, and CPageTab3的关联,然后利用属性表生成模态对话框,CCNETConfig是独立的。
%A
%A CPropertySheet: CpropertySheet类基本上是空的,当你点击不同的标签时,MFC会处理不同的属性页,CpropertySheet也是独立的。
%A
%A CPageTab: CpageTab类包含了与各自标签相关的代码,它完成属性页上数据的保存,传递,校验。
%A
%A 用户界面
%A
%A
%A
%A 在默认状态下,Embedded Tools软件上传应用程序到\Windows\Start Menu目录下。如果你把应用程序上传到\Windows\Start Menu\Settings目录下,在文件夹中也可以找到图标,如下图所示。
%A
%A Figure B
%A
%A
%A
%A 程序菜单里的图标
%A
%A 这一结构程序具有三个属性页,如图C所示。CPageTab1处理的是与数据更新相关的任务,CpageTab2处理参数选择相关的任务,CpageTab3传送到cnet.com的任务。
%A
%A 从整体上看,程序并不是很复杂。程序员可以很容易地把代码移植到诸如无线802.11b驱动程序上。
%A
%A 图 C
%A
%A
%A
%A 属性页面和其属性
%A
%A 每一个类都有它的特有成员变量表,这些变量能够通过MFC’s DDX保持编译环境的设置。在每一属性页的OnInitDialog函数中都执行UpdateData(FALSE)事件,然后在OnKillActive事件中通过UpdateData(TRUE)校验并把参数保存到注册表。
%A
%A 当OnKillActive事件被触发时程序就会把所有的信息保存到注册表,即使在程序发生异常的时候。而函数OnInitDialog则是对程序进行了初始化。
%A
%A 通过利用资源编辑器,我建立了如图D所示的三个属性表。标题栏遵循了其他程序的设计标准,标题栏下面的文字也采用了其他程序的字体和颜色。
%A
%A Figure D
%A
%A
%A
%A 属性菜单
%A
%A 字体下面的直线是采用1bit位图实现并当成一幅图片,除此之外,我还添加了检查框,静态文本框,编辑框,组合框等。
%A
%A 自定义静态文本框的字体和风格
%A
%A 为了获取静态文本框的合适字体,必需在CpageTab类中触发WindowProc事件,而只要发送WM_CTLCOLORSTATIC消息就可以更换静态文本框中的当前字体和字体的颜色了。
%A
%A WM_CTLCOLORSTATIC把hDC和hWnd传送到静态文本框,在函数中的这些变量如Listing A.所示。
%A
%A 你可以看到,我使用了一个静态变量来生成字体,然后重载这一指针变量就可以更改这些字体。如果你不想改变字体,即不要重载PropertyPages中的WindowProc事件,代码的其他部分都会正常运行。
%A
%A 除了要生成合适的字体外,我还注重把界面设计成具有Windows CE系统专业的水平。
%A
%A 生成带有属性页的属性表
%A 对于以上我生成的附带属性页的属性表,你一定会迷惑这一整个过程。我只是采用了MFC向导来自动生成四个独立的类,其中一个是派生于CpropertySheet类,其他三个是派生于CpropertyPage类。在CWinApp::InitInstance事件中,我在属性表中增加了属性页,如图Listing B所示。
%A
%A 我还举例说明了怎么样从CPropertySheet 和 CpropertyPage而不是从CPropertySheet 和CpropertyPage派生出对象。
%A
%A 我初始化了所有的变量并把页和表关联起来,之后调用DoModal事件就可以生成模态对话框。
%A
%A 当InitInstance返回FALSE,MFC不再执行窗体消息循环。我可以通过使用CPropertySheet::Create()而不是使用CPropertySheet::DoModal()来生成一个非模态对话框。如果我这样做,程序就返回TRUE,窗体消息循环就会进行。如果生成一个非模态对话框而返回FALSE,就会退出消息循环。
%A
%A 访问注册表
%A 为了保存信息到注册表中,程序必需执行CpageTab类中的OnInitDialog和OnKillActive事件。Listing C中的代码说明了这一过程。
%A
%A MFC能自动访问注册表,这一过程程序执行了GetProfileInt, GetProfileString, WriteProfileInt, 和 WriteProfileString函数。
%A
%A 图E显示了如何把界面上的参数选择和注册表入口关联起来。我采用EMbedded Tools 3.0软件中的Windows CE远程注册表编辑器来查看远距离设备上的注册表。
%A
%A Figure E
%A
%A
%A
%A 将键值保存在HKEY_CURRENT_USER\Software\CNET Networks, Inc\CNETConfig\etc…
%A
%A 你也应该注意到如何把关键字保存在HKEY_CURRENT_USER\Software\CNET Networks, Inc\CNETConfig\etc…下。
%A
%A 当采用MFC方式时,通常程序员都要调用
%A
%A WriteProfileInt
%A WriteProfileString
%A GetProfileInt
%A GetProfileString
%A 为了保存或恢复注册表中程序的原内容,下面函数要在以下位置访问注册表:
%A
%A HKEY_CURRENT_USER\Software\<company name>\<application name>\<section name>\<value name>。
%A
%A 软件名称通过SetRegistryKey来设置,各个部分名称和其他一些变量可以由以上的四个函数来实现。
%A
%A Unicode(统一的字符编码标准)
%A 在本文中所有的代码中,你应该注意到TEXT都是在圆括号内出现的,这是因为Windows CE采用Unicode标准来编写代码。Unicode要本质上是采用每字符16位而不是每字符8位的方式。
%A
%A 程序中我也采用了L””来替代TEXT(“”),这一方法显得更加方便,这也是采用了Unicode标准的字符串的原因。
%A
%A 结论
%A 在编译器提供的功能强大的帮助文献下,我成功地编写了一个Windows CE结构应用程序,程序可以访问和保存变量到注册表。程序的代码很少,却十分牢固,高效,并具有很好的扩展性。我也花了主要精力把界面尽可能地达到标准窗口的水准,我想这些对程序员的编程经历有很大的帮助。
%A
%A 接下去,我将转移到编写另一个应用程序,即如何在Windows CE环境下编写一个数据库。
%A
%A
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客