如何编写Windows CE结…

在上一章节里,我已经为如何编写真正意义上的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目录下,在文件夹中也可以找到图标,如下图所示。

[ 相关贴图 ]
430)this.width=430" align=center border=0>
这一结构程序具有三个属性页,如图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////<value name>。

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

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

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

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

你可能感兴趣的:(windows,mfc,任务,程序开发,微软,扩展)