ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 如何编写Windows CE结构的应用程序(转)

如何编写Windows CE结构的应用程序(转)

原创 Linux操作系统 作者:jcszjswkzhou 时间:2019-04-20 09:27:04 0 删除 编辑
在上一章节里,我已经为如何编写真正意义上的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软件上传应用程序到WindowsStart Menu目录下。如果你把应用程序上传到WindowsStart MenuSettings目录下,在文件夹中也可以找到图标,如下图所示。

Figure B

程序菜单里的图标

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

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

图 C

点击放大

属性页面和其属性

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

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

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

Figure 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_USERSoftwareCNET Networks, IncCNETConfigetc…

你也应该注意到如何把关键字保存在HKEY_CURRENT_USERSoftwareCNET Networks, IncCNETConfigetc…下。

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

  • WriteProfileInt
  • WriteProfileString
  • GetProfileInt
  • GetProfileString

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

HKEY_CURRENT_USERSoftware

。

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

Unicode(统一的字符编码标准)

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

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

结论

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

接下去,我将转移到编写另一个应用程序,即如何在Windows CE环境下编写一个数据库。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10294527/viewspace-126765/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-08-29

  • 博文量
    3481
  • 访问量
    3019736