| 网站首页 | 新闻 | SOPC | FPGA | DSP | ARM | 嵌入式操作系统 | 下载 | 所有产品 | 留言 | 论坛 | 购买指南 | 网络协议 | 驱动设计 | 
您现在的位置: 21嵌入式控制研究室 >> 嵌入式操作系统 >> Windows CE >> 文章正文 用户登录 新用户注册
[组图]如何编写Windows CE结构的应用程序            【字体:
如何编写Windows CE结构的应用程序
作者:佚名    文章来源:21control    点击数:    更新时间:2005-12-12
在上一章节里,我已经为如何编写真正意义上的Windows CE应用程序做好充分的准备。在本节中,我将继续深入这一主题。

我选择编写的这一应用程序,虽然相对简单,但你却可以从中知道怎么去编写比较复杂的程序(比“Hello World.”复杂)。这一应用程序包括属性页和属性表,即所说的TAB控件,它含有自定义的图标和跳格符,能把参数选择保存到注册表中。

程序开发的一个关键之处是保持和微软用户界面相一致的特性。在开发过程中我尽可能的采用了微软的应用程序的字体和布局,商业开发人员更应该为他们的Windows CE应用程序设计出优美的界面。

获取代码  
可以从这里下载这一例程的源代码

类结构
所有的代码加起来也有几千行,共分为5个文件。我选择用微软基础类库(MFC)来实现,软件也具有很好的扩展性,如图A所示。

Figure A

 

类结构

CCNETConfig:这是程序的主线程,它起动与注册表的连接,建立与CPageTab1, CPageTab2, and CPageTab3的关联,然后利用属性表生成模态对话框,CCNETConfig是独立的。

CPropertySheet: CpropertySheet类基本上是空的,当你点击不同的标签时,MFC会处理不同的属性页,CpropertySheet也是独立的。

CPageTab: CpageTab类包含了与各自标签相关的代码,它完成属性页上数据的保存,传递,校验。

用户界面 

 

在默认状态下,Embedded Tools软件上传应用程序到\Windows\Start Menu目录下。如果你把应用程序上传到\Windows\Start Menu\Settings目录下,在文件夹中也可以找到图标,如下图所示。

[ 相关贴图 ]

这一结构程序具有三个属性页,如图C所示。CPageTab1处理的是与数据更新相关的任务,CpageTab2处理参数选择相关的任务,CpageTab3传送到cnet.com的任务。

从整体上看,程序并不是很复杂。程序员可以很容易地把代码移植到诸如无线802.11b驱动程序上。

图 C

 

属性页面和其属性

每一个类都有它的特有成员变量表,这些变量能够通过MFC’s DDX保持编译环境的设置。在每一属性页的OnInitDialog函数中都执行UpdateData(FALSE)事件,然后在OnKillActive事件中通过UpdateData(TRUE)校验并把参数保存到注册表。

当OnKillActive事件被触发时程序就会把所有的信息保存到注册表,即使在程序发生异常的时候。而函数OnInitDialog则是对程序进行了初始化。

通过利用资源编辑器,我建立了如图D所示的三个属性表。标题栏遵循了其他程序的设计标准,标题栏下面的文字也采用了其他程序的字体和颜色。

[ 相关贴图 ]


字体下面的直线是采用1bit位图实现并当成一幅图片,除此之外,我还添加了检查框,静态文本框,编辑框,组合框等。

自定义静态文本框的字体和风格

为了获取静态文本框的合适字体,必需在CpageTab类中触发WindowProc事件,而只要发送WM_CTLCOLORSTATIC消息就可以更换静态文本框中的当前字体和字体的颜色了。

WM_CTLCOLORSTATIC把hDC和hWnd传送到静态文本框,在函数中的这些变量如Listing A.所示。

你可以看到,我使用了一个静态变量来生成字体,然后重载这一指针变量就可以更改这些字体。如果你不想改变字体,即不要重载PropertyPages中的WindowProc事件,代码的其他部分都会正常运行。

除了要生成合适的字体外,我还注重把界面设计成具有Windows CE系统专业的水平。

生成带有属性页的属性表
对于以上我生成的附带属性页的属性表,你一定会迷惑这一整个过程。我只是采用了MFC向导来自动生成四个独立的类,其中一个是派生于CpropertySheet类,其他三个是派生于CpropertyPage类。在CWinApp::InitInstance事件中,我在属性表中增加了属性页,如图Listing B所示。

我还举例说明了怎么样从CPropertySheet 和 CpropertyPage而不是从CPropertySheet 和CpropertyPage派生出对象。

我初始化了所有的变量并把页和表关联起来,之后调用DoModal事件就可以生成模态对话框。

当InitInstance返回FALSE,MFC不再执行窗体消息循环。我可以通过使用CPropertySheet::Create()而不是使用CPropertySheet::DoModal()来生成一个非模态对话框。如果我这样做,程序就返回TRUE,窗体消息循环就会进行。如果生成一个非模态对话框而返回FALSE,就会退出消息循环。

访问注册表
为了保存信息到注册表中,程序必需执行CpageTab类中的OnInitDialog和OnKillActive事件。Listing C中的代码说明了这一过程。

MFC能自动访问注册表,这一过程程序执行了GetProfileInt, GetProfileString, WriteProfileInt, 和 WriteProfileString函数。

图E显示了如何把界面上的参数选择和注册表入口关联起来。我采用EMbedded Tools 3.0软件中的Windows CE远程注册表编辑器来查看远距离设备上的注册表。

Figure E

[ 相关贴图 ]


将键值保存在HKEY_CURRENT_USER\Software\CNET Networks, Inc\CNETConfig\etc…

你也应该注意到如何把关键字保存在HKEY_CURRENT_USER\Software\CNET Networks, Inc\CNETConfig\etc…下。

当采用MFC方式时,通常程序员都要调用

WriteProfileInt 
WriteProfileString 
GetProfileInt 
GetProfileString 
为了保存或恢复注册表中程序的原内容,下面函数要在以下位置访问注册表:

HKEY_CURRENT_USER\Software\<company name>\<application name>\<section name>\<value name>。

软件名称通过SetRegistryKey来设置,各个部分名称和其他一些变量可以由以上的四个函数来实现。

Unicode(统一的字符编码标准)
在本文中所有的代码中,你应该注意到TEXT都是在圆括号内出现的,这是因为Windows CE采用Unicode标准来编写代码。Unicode要本质上是采用每字符16位而不是每字符8位的方式。

程序中我也采用了L””来替代TEXT(“”),这一方法显得更加方便,这也是采用了Unicode标准的字符串的原因。

结论
在编译器提供的功能强大的帮助文献下,我成功地编写了一个Windows CE结构应用程序,程序可以访问和保存变量到注册表。程序的代码很少,却十分牢固,高效,并具有很好的扩展性。我也花了主要精力把界面尽可能地达到标准窗口的水准,我想这些对程序员的编程经历有很大的帮助。

接下去,我将转移到编写另一个应用程序,即如何在Windows CE环境下编写一个数据库。
文章录入:flyongrass    责任编辑:flyongrass 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
  • 基于WindowsCE的GPS数据导航…

  • Windows CE.net的智能移动信…

  • Windows CE.net的智能移动信…

  • 基于Windows CE的COM应用开发

  • WinCE操作系统的基本体系结构

  • Microsoft Windows CE 编程的…

  • WinCE开发常识

  • 开发windows ce 程序一定要掌…

  • Windows CE在嵌入式工业控制…

  • 如何安装Windows CE ?

  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)