现在的位置: 首页 > 综合 > 正文

Microsoft .NET Compact Framework 开发常见问题解答

2013年08月27日 ⁄ 综合 ⁄ 共 22562字 ⁄ 字号 评论关闭
文章目录

 http://203.208.35.132/search?q=cache:x_O1SAC1E2kJ:tech.it168.com/knowledgebase/Articles/7/1/1/71116dfa1e8adc2bf364db4876d33f19.htm+SelectedIndex%E5%BC%95%E5%8F%91%E4%BA%86System.NotSupportedException&cd=8&hl=zh-CN&ct=clnk&gl=cn&st_usg=ALhdy2__qIAyfwuGwE1PsradJU_QVZG6Ig

 

Microsoft .NET Compact Framework 开发常见问题解答

这个 FAQ 有部分是通过编辑公共
.NET Compact Framework 新闻组
(microsoft.public.dotnet.framework.compactframework) 贴出的问题和解答而得到的。.NET
Compact Framework 团队衷心感谢参加公共新闻组的每个人,感谢他们对本 FAQ 和整个 .NET Compact
Framework 开发社区做出的贡献。

要想获得 FAQ 项,请将电子邮件发送到
netcfaq@microsoft.com

*

本页内容
1. 开发 1. 开发
2. 图形 2. 图形
3. 部署 3. 部署
4. 图形用户界面 (GUI):窗体 4. 图形用户界面 (GUI):窗体
5. 图形用户界面 (GUI):常规 5. 图形用户界面 (GUI):常规
6. 互操作性和本机代码 6. 互操作性和本机代码
7. 常规 7. 常规
8. 通信和 Web 服务 8. 通信和 Web 服务
9. SQL CE 和数据 9. SQL CE 和数据
10. 其他信息 10. 其他信息
11. 连接 11. 连接
12. 基于 Windows Mobile 的 Smartphone 12. 基于 Windows Mobile 的 Smartphone

1. 开发

1.1. 什么是 Microsoft .NET Compact Framework?

Microsoft .NET Compact Framework 是针对 Microsoft .NET 计划的智能设备开发框架,是实现
Microsoft 随时随地在任何设备上为客户提供良好体验的目标的关键所在。.NET Compact Framework 将托管代码和 Web
服务带给了智能设备,它允许安全的、可下载的应用程序在诸如个人数字助理 (PDA)、移动电话和机顶盒等设备上运行。

http://msdn.microsoft.com/mobility/prodtechinfo/devtools/netcf/overview/default.aspx

1.2.开发 .NET Compact Framework 应用程序需要什么工具?

Visual Studio .NET 为基于 Windows Mobile 的 Pocket PC 2000、基于 Windows
Mobile 的 Pocket PC 2002 和 Windows CE .NET 4.1 设备开发基于 .NET Compact
Framework 的应用程序需要 2003 Professional 或更高版本。Visual Studio .NET 2003 附带了
.NET Compact Framework。

http://msdn.microsoft.com/mobility/prodtechinfo/devtools/vstudio/default.aspx

在最新的 Windows Mobile 平台上进行开发还有其他的 SDK 可用:

Windows Mobile 2003 Pocket PC SDK:
http://www.microsoft.com/downloads/details.aspx?familyid=9996b314-0364-4623-9ede-0b5fbb133652&displaylang=en

Windows Mobile 2003 Smartphone SDK:
http://www.microsoft.com/downloads/details.aspx?familyid=a6c4f799-ec5c-427c-807c-4c0f96765a81&displaylang=en

本文将提供用 .NET Compact Framework 1.0 和 Visual Studio .NET 2003 开发健壮的智能客户端设备应用程序的说明。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfgetstarted.asp

1.3. 哪里可以下载最新的工具和软件?

Visual Studio .NET 2003 试用版可以通过以下地址获得:
http://msdn.microsoft.com/vstudio/productinfo/trial/default.aspx

最新的平台更新和 .NET Compact Framework service pack 可以通过以下地址获得:
http://msdn.microsoft.com/mobility/downloads/default.aspx

1.4. .NET Compact Framework 支持什么设备?

.NET Compact Framework 支持基于 Windows Mobile 2000 的 Pocket PC、基于
Windows Mobile 2002 的 Pocket PC、基于 Windows Mobile 2003 的 Pocket PC、基于
Windows Mobile 的 Smartphone 和运行 Windows CE .NET 4.1 及更高版本的嵌入式系统。

1.5. 以后 .NET Compact Framework 将会支持什么设备?

不久以后,.NET Compact Framework 将会作为一个操作系统 (OS) 组件,在所有的 Microsoft
智能设备中提供,包括将来基于 Windows Mobile 的 Pocket PC 设备、基于 Windows Mobile 的 Pocket
PC Phone Edition、基于 Windows Mobile 的 Smartphone、Windows CE for
Automotive 和 MSTV。每种特定设备的具体时间选择将由各个产品发布周期确定。

Windows CE .NET 4.1 也支持 .NET Compact Framework,将其作为一个集成的 OS 组件,因此允许
OEM 使用 Platform Builder 工具将 .NET Compact Framework 嵌入到所有装备 Windows CE
的新设备中。

1.6. 调试器在与模拟器建立连接时为什么会失败(错误启动应用程序)?

以下链接是针对调试的安装和疑难解答指南:

http://download.microsoft.com/download/c/d/b/cdbff573-73fb-4f9f-a464-c5adc890e1ae/Readme.htm

1.7. .NET Framework 和 .NET Compact Framework 之间有什么区别?

请参见下面 .NET Framework 和 .NET Compact Framework 之间的比较:
http://msdn.microsoft.com/library/en-us/dv_evtuv/html/etconComparisonsWithNETFramework.asp

.NET Compact Framework 类库比较工具中的信息:
http://msdn.microsoft.com/library/en-us/dv_spchk/html/NET_Compact_Framework.htm

1.8.最新的 .NET Compact Framework Service Pack 有什么新内容?

.NET Compact Framework SP2 提供了针对大量缺陷的补丁。补丁列表可由以下链接获得:
http://www.microsoft.com/downloads/details.aspx?familyid=10600643-09b3-46d8-ba28-bc494bc20d26&displaylang=en

.NET Compact Framework SP1 提供了针对大量缺陷的补丁。补丁列表可由以下链接获得:
http://www.microsoft.com/downloads/details.aspx?familyid=1f62a2a3-7282-4ba9-b26b-2267e972501d&displaylang=en

注:
Service Pack 2 (SP2) 替代了 Service Pack 1 (SP1),它包括所有 service pack 的最新更新。

1.9. 在 .NET Compact Framework 开发中,基于 Windows Mobile 的 Pocket PC 和 Windows CE .NET 之间有什么区别?

这篇文章概述了为基于 Windows Mobile 的 Pocket PC 和 Microsoft Windows CE .NET 平台开发基于 Microsoft .NET Compact Framework 的应用程序之间的区别。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfPPCtoCE.asp

1.10. 在哪里可以找到有关如何创建基于 .NET Compact Framework 的应用程序的更多信息?

下列资源有助于您了解如何创建基于 .NET Compact Framework 的应用程序:

.NET Compact Framework 快速入门
http://samples.gotdotnet.com/quickstart/compactframework/

MSDN 移动与嵌入式技术开发人员中心中的 .NET Compact Framework 白皮书:
http://msdn.microsoft.com/mobility/understanding/articles/default.aspx

1.11. .NET Compact Framework 的文档在什么位置?

http://msdn.microsoft.com/library/en-us/dv_evtuv/html/etconNETCompactFramework.asp

1.12. 如何指定在每次调试器运行时不必复制依赖文件?

在 Visual Studio .NET 2003 中,右键单击该项目并选择 Properties
。将 Build Action 更改为 None
。这样就不会再复制此文件了。如果此文件已修改或者需要再复制,则将 Build Action 更改为 Content

1.13. 如何设置模拟器属性?

在 Visual Studio .NET 2003 中,从菜单中选择 Tools->Options
。然后打开 Device Tools
文件夹并选择 Devices
。现在应该能看到一个显示设备选择列表的对话框。选择您想要修改的设备,然后按 Configure
按钮。

现在您应该能够看到一个含有几个选项卡的对话框,它允许您访问和修改设置,例如内存和屏幕大小。

1.14. 如何调试 Microsoft .NET Compact Framework 应用程序?

Microsoft .NET Compact Framework 完全集成在 Visual Studio .NET 2003
中,它支持的调试功能与对其他 Visual Studio .NET
应用程序类型可用的调试功能相同。但是,在独立设备或在仿真器中调试运行的应用程序时,用户需要注意一些特殊事项。请参考下列建议以获得最详尽的
.NET Compact Framework 调试体验:
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/CompactFXDebug.asp

1.15. 如何开始使用 Visual Basic .NET 为设备开发应用程序?

了解如何使用用于 Visual Studio .NET 的智能设备扩展 (SDE) 来为支持 .NET Compact
Framework 的智能设备构建 Windows 应用程序。这篇文章包括对整个开发、调试和部署过程的检查,并探讨了 .NET
Framework 和 .NET Compact Framework 之间的区别。


http://msdn.microsoft.com/library/en-us/dnnetcomp/html/sdeforvb.asp

1.16. 如何将 .NET Compact Framework 程序集安装到全局程序集缓存 (GAC) 中?

http://msdn.microsoft.com/library/en-us/dncfhowto/html/HOWTOGAC.asp

1.17. 当通过 Visual Studio .NET 2003 部署智能设备应用程序时,如何处理“共享冲突”?

这篇文章阐述了阻止通过 Visual Studio .NET 2003 部署应用程序的共享冲突产生的原因,并介绍了解决这一冲突的方法。
http://msdn.microsoft.com/library/en-us/dncfhowto/html/HOWTOSharingviolation.asp

1.18. 公共语言运行库 (CLR) 是什么?

.NET Compact Framework 提供了一个名为公共语言运行库的运行时环境,它运行代码并提供一些可以使开发过程更加轻松的服务。在这篇概述中可以了解更多内容:
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconcommonlanguageruntimeoverview.asp

1.19. 全局程序集缓存 (GAC) 是什么?

每台安装公共语言运行库的计算机都有一个机器范围的代码缓存,称为全局程序集缓存。全局程序集缓存中存储的程序集是专门由计算机中的几个应用程序共享的程序集。这篇文章提供了有关 GAC 的更多信息:
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconglobalassemblycache.asp

1.20. 在 .NET Compact Framework 中如何管理内存?

自动内存管理是在托管执行过程中 CLR 提供的服务之一。CLR 垃圾回收器管理应用程序的内存分配和释放,如这篇文章所描述的:
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconautomaticmemorymanagement.asp

1.21. 当网络协议数超过 50 时,为什么就无法部署到设备?

请参见本 FAQ 中标题为
“11.4.当网络协议数超过 50 时,为什么无法部署到设备?”的项。

1.22. 为什么有跨平台二进制?

.NET Compact Framework 和执行引擎是完整的 .NET Framework 和 CLR
的一个兼容子集实现。当不存在强名称绑定策略时,针对 .NET Compact Framework 编译的应用程序将会绑定和运行在整个 .NET
Framework 上,但有一些重要的例外:

.NET Compact Framework 程序集由不同的强名称密钥对进行签名,这样 CLR 可以将它们与其全部 .NET 副本区分开来。


来发布的完整的 .NET Framework 和 CLR 将包括绑定策略,它可以将完整的 .NET Framework 程序集替换为兼容
.NET Compact Framework 引用。然后在一些常见的情况中,它可以重复使用现有的组件而不需要重新链接。例如,如果您的组件只引用
.NET Compact Framework System
System
.NET 类,则它可以在 .NET Compact Framework 和整个 .NET Framework 上很好地运行而不需要重新链接。

如果您的引用功能与 .NET Compact Framework 不同,例如基于 Windows Mobile 的 Pocket PC 特定的 UI 控件,则您的程序将会在与整个 .NET Framework 绑定时失败。

就像跨平台二进制兼容性简化了中间件组件的开发和部署一样,Microsoft 相信胖客户端应用程序应该利用特定于设备的功能来提高用户体验。这意味着最好的 GUI 代码可能是特定于目标的。

虽然 Microsoft 已经做出了很大的努力,将特定于设备的功能分解为离散的命名空间和程序集以避免绑定冲突,但可能存在版本 1 无法处理的不兼容分解的情况。在这些情况下,在整个 .NET Framework 中滥用特定于设备的功能将会引发
运行时异常而非应用程序加载异常。

1.23. 所有这些 ARM 二进制是些什么?

XScale 支持 ARM v5 指令集,不过它也向后兼容 ARMv4 指令集。它有三个变种:

ARMv4 -> 它只支持 32 位 ARMv4 指令

ARMv4T ->“T”代表 Thumb。Thumb 是 ARM 16 位指令模式

ARMv4I ->“I”代表交互作用 (Interworking)。它允许 32 位指令和 16 位指令共存

对于其他的 ARM 处理器:

StrongARM (SA1110) -> 只支持 ARMv4 指令

ARM920T 等 -> 通常支持这三个变种

.NET Compact Framework 将提供三组用于 ARM 的二进制。


于基于 Windows Mobile 2000 和基于 Windows Mobile 2002 的 Pocket PC 2002 的
ARMv4。它将运行 ARM 设备(包括 Xscale)的所有 ARM。部署到这些设备中的 cab 只能在名称中包含“arm”。


于 Windows CE.NET 的 ARMv4。它将运行在通过 Platform Builder 中的 ARMv4 内核编译的
Windows CE.NET 设备中。它也是用于基于 Windows Mobile 的 Pocket PC 2003
的二进制。为这些设备部署的 cab 在名称中包含“armv4”。


于 Windows CE.NET 的 ARMv4T 或 ARMv4I。它将运行在通过 Platform builder 中的 ARMv4T 或
ARMv4I 内核编译的 Windows CE.NET 设备中。部署到这些设备中的 cab 在名称中包含“armv4T”。

1.24. 如何写入设备的注册表中?

Visual Studio .NET 没有附带用于 Windows CE 的远程注册表编辑器。要设置注册表项,可以使用以下工具之一:

Microsoft Embedded Visual Tools Remote Registry Editor

Microsoft Windows CE Platform Builder Remote Registry Editor

基于 PHM Windows Mobile 的 Pocket PC Registry Editor(共享件,可以很容易在网上找到)

1.25. 安装完成后如何防止 .CAB 文件被删除?

将 .CAB 文件的属性设置为只读,可以防止 .CAB 文件被自动删除。

1.26. 如何确定设备中安装的 .NET Compact Framework 的版本?

发行的每个 .NET Compact Framework 版本都有一个不同的 Win32
文件版本号(它是与程序集版本相独立的版本号,对于发行的所有 .NET Compact Framework 第一版(包括 Service
Pack),这两者应该是一样的)。

要查看安装的是什么版本,可以使用文件资源管理器,定位于设备的 /Windows 目录,并单击名为 CGACUTIL 的文件。将会弹出一个消息框,显示安装在设备中的 .NET Compact Framework 的 Win32 文件版本。

RTM = 1.0.2268.0SP1 = 1.0.3111.0SP2 Recall = 1.0.3226.0SP2 Beta = 1.0.3227.0SP2 Final = 1.0.3316.0

要以编程方式确定版本,可以使用 System
.Environment.Version.ToString()。

要通过桌面安装程序确定版本,请参见本 FAQ 中标题为“3.10.如何通过桌面安装程序检测 .NET Compact Framework 的版本?”的项。

1.27. 如何将文件复制到模拟器中?

一种方式是在开发 PC
中创建一个文件共享,然后通过模拟器中的文件资源管理器连接到该共享。也可以将文件从共享位置复制并粘贴到模拟器的本地文件系统中。另一种方式是将文件添
加到智能设备项目中,并将它们的 Build Action 属性设置为“Content”。有关“文件属性”的更多信息,请参阅 Visual
Studio .NET 联机文档:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbconfileproperties.asp

以下内容逐步介绍了如何将一个“Content”文件添加到智能设备项目中:

1.

打开或创建一个智能设备项目,

2.

在“View”菜单中,单击“Solution Explorer”,

3.

在“Solution Explorer”中,右键单击您的项目,指向“Add”并单击“Add Existing Item”。浏览至想要的文件并添加到该项目中。

4.

在“Solution Explorer”中,右键单击添加的文件并单击“Properties”,

5.

如果 Build Action 属性尚未设置,则将它设置为“Content”。

1.28. 为什么基于 Windows Mobile 的 Pocket PC 2002 SDK 安装失败?

表现

在“注册组件”时,基于 Windows Mobile 的 Pocket PC 2002 SDK 安装程序挂起。

原因:
在尝试运行模拟器时,未注册的组件导致安装挂起。

解决办法:
在控制台窗口提示中键入:cd /WINNT/system32regsvr32 atl.dll

1.29. 如何调试智能设备应用程序使用的 Web 服务?

您需要将调试器附加到 ASP.NET 辅助进程中。

有关更多信息,请参见以下链接:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsdebug/html/vxtskdebugginganaspdeployedwebapplication.asp

1.30. 什么是 .NET Compact Framework 的足迹?

.NET Compact Framework 存储大小:

在基于 Windows Mobile 的 Pocket PC 2000/2002 上有 1.55MB (ROM)

在用于 Pocket PC 2003 或 Windows CE .NET 设备的 Windows Mobile 上有 1.35MB (ROM)

运行 RAM 的要求:

.5 MB+(取决于应用程序)

典型的应用程序大小:

5 - 100 KB

1.31. 如何将 imgdecmp.dll 包括在模拟器映像中?

您必须让 OEM 将它包括在设备的映像中。如果您就是 OEM 而且您正在使用 Platform Builder 4.2,则包括 .NET
项目的 OS 依赖项会自动使 imgdecmp.dll 成为模拟器映像的一部分 — 如果这样不行则再引用
cesysgen.bat。另一种方法是设置环境变量“__SYSGEN_IMGDECMP=1”,显式强制该 DLL 包含在映像中。

1.32. 如何以编程方式替换全局程序集缓存 (GAC) 中的程序集?

可以通过以编程方式启动 cgacutil 来直接在 GAC 中安装程序集和从 GAC 中删除程序集。

使用 -u 选项可以从 GAC 删除程序集

使用 -i 选项可以在 GAC 中安装程序集

通常最安全的做法是重新安装一个程序集之前先将它删除。

1.33. 如何在台式计算机或便携式计算机中显示基于 Windows Mobile 的 Pocket PC 应用程序而不需要任何设备端配置?

从 Windows Mobile Developer Power Toys 下载 ActiveSync Remote Display:
http://www.microsoft.com/downloads/details.aspx?FamilyId=74473FD6-1DCC-47AA-AB28-6A2B006EDFE9&displaylang=en

1.34. 如何使 Activesync 能够从 Visual Studio .NET 2003 连接到模拟器会话?

请参见本 FAQ 中标题为“11.17.如何使 Activesync 能够从 Visual Studio .NET 2003 连接到模拟器会话?”的项。

1.35. 如何将文件复制到当前连接到桌面 ActiveSync 的设备中?

请参见本 FAQ 中标题为“11.18.如何将文件复制到当前连接到桌面 ActiveSync 的设备中?”的项。

1.36. 如何重点测试用户输入?

从 Windows Mobile Developer Power Toys 下载 Hopper:
http://www.microsoft.com/downloads/details.aspx?FamilyId=74473FD6-1DCC-47AA-AB28-6A2B006EDFE9&displaylang=en

1.37. 从哪里可以获得平台生成器目标控件窗口的 UI 版本?

从 Windows Mobile Developer Power Toys 下载 Jshell:
http://www.microsoft.com/downloads/details.aspx?FamilyId=74473FD6-1DCC-47AA-AB28-6A2B006EDFE9&displaylang=en

1.38. 从哪里可以获得用于基于 Windows Mobile 的 Pocket PC 2003 设备的命令外壳?

从 Windows Mobile Developer Power Toys 下载 PPC 命令外壳:
http://www.microsoft.com/downloads/details.aspx?FamilyId=74473FD6-1DCC-47AA-AB28-6A2B006EDFE9&displaylang=en

1.39. 如何获得当前运行进程的详细信息?

从 Windows Mobile Developer Power Toys 下载 RAPI Debug:
http://www.microsoft.com/downloads/details.aspx?FamilyId=74473FD6-1DCC-47AA-AB28-6A2B006EDFE9&displaylang=en

1.40. 如何从桌面远程启动基于 Windows Mobile 的 Pocket PC 上的应用程序?

从 Windows Mobile Developer Power Toys 下载 RAPI Start:
http://www.microsoft.com/downloads/details.aspx?FamilyId=74473FD6-1DCC-47AA-AB28-6A2B006EDFE9&displaylang=en

1.41. 为什么不能加载具有相同名称的不同程序集?

这是设计的原因。您要么必须更改 DLL 的名称,或者如果 DLL 具有强名称,则将它们放在 GAC 中并使用具有完全强名称的 Assembly.Load。

1.42. 如何强制 Visual Studio .NET 2003 连接到较新版本的基于 Windows Mobile 的 Pocket PC 2003 模拟器?

从 Windows Mobile Developer Power Toys 下载 Emulator ActiveSync Connection Tool:
http://www.microsoft.com/downloads/details.aspx?familyid=74473FD6-1DCC-47AA-AB28-6A2B006EDFE9&displaylang=en

它允许 ActiveSync 通过 Visual Studio .NET 2003 连接到您的模拟器会话。为 4.2 模拟器创建一个
ActiveSync 会话,它可以使 Visual Studio 2003 将其视为一个真正的设备(选择 PPC 设备作为部署目标)。

1.43. 为什么我的自定义控件不能正确地显示在工具箱中?

当在 Visual Studio .NET 2003 中为智能设备自定义控件添加设计器支持时,您可能会碰到以下问题:

在设计时无法将一个图标与控件相关,以便显示在工具箱中

当添加到工具箱中时,该组件变灰

原因

使用独立于控件项目的设计项目。Visual Studio .NET 自动将项目的默认命名空间作为位图的名称。“默认命名空间”默认为项目名称。这可能会产生问题,因为设计项目的名称与运行时项目的名称略有差别。

没有设置正确的 ToolBoxItemFilterAttribute 值

解决方案

提供以下示例:Runtime VS.NET Project:MyProject类名称:MyProject.MyClass设计
VS.NET 项目名称:MyProject.DesignVS.NET 设计项目中的 BitMap
名称:Foo.bmp设计程序集中的位图名称:MyProject.Design.MyClass.bmp—
这样会产生问题,因为该位图需要以下名称:MyProject.MyClass.bmp

在以上示例中,将设计项目的默认命名空间设置为“MyProject”而非“MyProject.Design”就可以解决这个问题。

检查程序集中位图名称的最简单方法是运行 ILDASM 并打开 Manifest。该清单的尾部列出了嵌入式资源。

如果您创建了一个从 Component 类派生的自定义组件,则您的代码必须包括以下语句,这样您的组件才能出现在工具箱中:

ToolBoxItemFilterAttribute("NETCF",ToolBoxItemFilterType.Require)
ToolBoxItemFilterAttribute("System .CF.Windows.Forms", ToolBoxITemFilterType.Custom)

2. 图形

2.1. 如何创建 Graphics 对象?

图形对象根据其用途有几种创建方式:

通过 OnPaint,使用 PaintEventArgs 中提供的对象:

//C#

protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawLine(...);
}

'VB

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
e.Graphics.DrawLine(...)
End Sub 'OnPaint

通过代码中的其他区域,该函数是 Control 的一个方法,可以用来创建任何控件的图形对象:

//C#

using System
.Drawing;
Graphics g = this.CreateGraphics();

'VB

Imports System
.Drawing
Dim g As Graphics = Me.CreateGraphics()

直接在一个位图中绘制:

//C#

using System
.Drawing;
Bitmap bm = new Bitmap(10,10);
Graphics g = Graphics.FromImage(bm);

'VB

Imports System
.Drawing
Dim bm As New Bitmap(10, 10)
Dim g As Graphics = Graphics.FromImage(bm)

2.2. 可以怎样优化 GDI+ 呈现?

当使用 Graphics 绘画调用时,有几种基本的编码实践可以帮助提高绘画速度:

只创建一个 Graphics 对象(或者使用来自 OnPaint 中的 PaintEventArgs 的 Graphics 对象)。

在屏幕外的位图中完成所有绘画,然后拖曳该位图,使它一次全部显示出来。

只重画图像的更改部分。

尽可能使绘制的源和目的大小相同(不要拉伸等等)。

也许最重要的实践是保留需要重画的项目的痕迹以便使出现的绘画量尽可能少。例如,如果拖曳光标跨过图像,就不需要重画整个图像。相反,只需重画前一个光标位置覆盖的图像部分。

2.3. 如何在窗体中绘制图像?

此示例显示了如何将一个图形作为窗体的背景图像显示:
http://samples.gotdotnet.com/quickstart/CompactFramework/doc/bkgndimage.aspx

2.4. 如何绘制具有透明度的图像?

绘制有透明度的图像需要一个指定透明颜色的 ImageAttributes 对象。当前,.NET Compact
Framework 支持单种颜色的原色调透明度。虽然 SetColorKey 函数允许一个颜色范围,但最小和最大的颜色必须相同,否则会产生运行时 ArgumentException:

//C#

using System
.Drawing.Imaging;
ImageAttributes attr = new ImageAttributes();

'VB

Imports System
.Drawing.Imaging
Dim attr As New ImageAttributes()

以下代码演示了如何根据图像的左上像素设置透明色调。

//C#

attr.SetColorKey(bmp.GetPixel(0,0), bmp.GetPixel(0,0));

'VB

attr.SetColorKey(bmp.GetPixel(0,0), bmp.GetPixel(0,0))

也可以按照如下所述方法显式设置颜色:

//C#

attr.SetColorKey(Color.FromArgb(255,0,255),Color.FromArgb(255,0,255));
attr.SetColorKey(Color.Fuchsia, Color.Fuchsia);

'VB

attr.SetColorKey(Color.FromArgb(255,0,255),Color.FromArgb(255,0,255))
attr.SetColorKey(Color.Fuchsia, Color.Fuchsia)

然后可以用重载的 Graphics.DrawImage 函数(它将 ImageAttributes 对象作为一个参数)来绘制图像:

//C#

Rectangle dstRect = new Rectangle(0, 0, bmp.Width, bmp.Height);
g.DrawImage(bmp, dstRect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attr);

'VB

Dim dstRect As New Rectangle(0, 0, bmp.Width, bmp.Height)
g.DrawImage(bmp, dstRect, 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attr)

2.5. 当我在 TextBox 中调用 CreateGraphics 时它为什么会失败?

只有 Control 和 Form 类支持 Control.CreateGraphics()。

2.6. 如何确定文本的屏幕大小?

使用 Graphics 方法 MeasureString。以下代码演示了如何在一些文本周围绘制一个框:

//C#

using System
.Drawing;
protected override void OnPaint(PaintEventArgs e)
{
string s = "Hello World"
Pen pen = new Pen(Color.Fuchsia);
Font font = new Font("Arial", 18, FontStyle.Regular);
Brush brush = new SolidBrush(Color.Black);
SizeF sSize = e.Graphics.MeasureString(s, font);
Rectangle r = new Rectangle(9, 199,(int)sSize.Width + 1, (int)sSize.Height + 1);
e.Graphics.DrawRectangle(pen, r);
e.Graphics.DrawString(s, font, brush, 10.0f, 200.0f);
base.OnPaint (e);
}

'VB

Imports System
.Drawing
Protected Overrides Sub OnPaint(e As PaintEventArgs)
Dim s As String = "Hello World"
Dim pen As New Pen(Color.Fuchsia)
Dim font As New Font("Arial", 18, FontStyle.Regular)
Dim brush = New SolidBrush(Color.Black)
Dim sSize As SizeF = e.Graphics.MeasureString(s, font)
Dim r As New Rectangle(9, 199, Fix(sSize.Width) + 1, Fix(sSize.Height) + 1)
e.Graphics.DrawRectangle(pen, r)
e.Graphics.DrawString(s, font, brush, 10F, 200F)
MyBase.OnPaint(e)
End Sub 'OnPaint

2.7. 可以设置画笔的宽度吗?

.NET Compact Framework 中不可以设置画笔宽度。有一些替代办法,包括:

采用 Graphics.FillRectangle 方法绘制实心矩形

绘制多条并行线

采用 GAPI 编写自定义图形例程

2.8. 如何缩放图像?

虽然没有对缩放和拉伸单个图像的内在支持,但这些效果也可以很轻松地实现,方法是使用相关的 Graphics 对象创建新的 Bitmap
对象,然后将原有 Bitmap
想要的部分复制到新建对象上。以下示例创建了两个大小相同的位图,其中第二个位图包含第一个位图经放大的中心部分,并假定项目有一个名为
MyImage.bmp 的嵌入式资源。这样的技术也可以用来拉伸图像,方法是修改源和目的矩形以便它们没有保留其原有的纵横比。

//C#

using System
.Drawing;
using System .Reflection;
Bitmap m_bmpOriginal;
Bitmap m_bmpZoom;
private void Form1_Load(object sender, System .EventArgs e)
{
Assembly asm = Assembly.GetExecutingAssembly();
m_bmpOriginal = new Bitmap(asm.GetManifestResourceStream(asm.GetName().Name
+ ".MyImage.bmp"));
// Take the center quarter of m_bmpOriginal
// and create stetch it into m_bmpZoom of the same size
m_bmpZoom = new Bitmap(m_bmpOriginal.Width, m_bmpOriginal.Height);
Graphics gZoom = Graphics.FromImage(m_bmpZoom);
Rectangle srcRect = new Rectangle(m_bmpOriginal.Width / 4, m_bmpOriginal.Height / 4,
m_bmpOriginal.Width / 2, m_bmpOriginal.Height / 2);
Rectangle dstRect = new Rectangle(0, 0, m_bmpZoom.Width, m_bmpZoom.Height);
gZoom.DrawImage(m_bmpOriginal, dstRect, srcRect, GraphicsUnit.Pixel);
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.DrawImage(m_bmpOriginal, 0, 0);
e.Graphics.DrawImage(m_bmpZoom, 125, 0);
base.OnPaint (e);
}

'VB

Imports System
.Drawing
Imports System .Reflection
Private m_bmpOriginal As Bitmap
Private m_bmpZoom As Bitmap
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System .EventArgs) Handles MyBase.Load
Dim asm As [Assembly] = [Assembly].GetExecutingAssembly()
m_bmpOriginal = New Bitmap(asm.GetManifestResourceStream((asm.GetName().Name _
+ ".MyImage.bmp")))
' Take the center quarter of m_bmpOriginal
' and create stetch it into m_bmpZoom of the same size
m_bmpZoom = New Bitmap(m_bmpOriginal.Width, m_bmpOriginal.Height)
Dim gZoom As Graphics = Graphics.FromImage(m_bmpZoom)
Dim srcRect As New Rectangle(m_bmpOriginal.Width / 4, m_bmpOriginal.Height / 4, _
m_bmpOriginal.Width / 2, m_bmpOriginal.Height / 2)
Dim dstRect As New Rectangle(0, 0, m_bmpZoom.Width, m_bmpZoom.Height)
gZoom.DrawImage(m_bmpOriginal, dstRect, srcRect, GraphicsUnit.Pixel)
End Sub 'Form1_Load
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
e.Graphics.DrawImage(m_bmpOriginal, 0, 0)
e.Graphics.DrawImage(m_bmpZoom, 125, 0)
MyBase.OnPaint(e)
End Sub 'OnPaint

2.9. 为什么我不能加载图像?

确保 imgdecmp.dll 位于设备的 Windows 目录。

有关更多信息,请参见本 FAQ 中的主题“ HYPERLINK /l "1.31" 1.31.如何将 imgdemp.dll 包括在模拟器映像中?”。

2.10. 如何使用 GAPI 创建图形引擎?

这篇文章描述了如何创建包装 GAPI (Game API) 的 DLL,使之与 .NET Compact Framework 兼容,并用它来创建和优化托管代码中的基本图形库。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/WrapGAPI1.asp

这篇文章实现了位图的加载和显示,从而扩展了“Dancing Rectangles”示例。它还实现了一些更高级的功能,例如动画位图、源和目的色调透明和 alpha 值混合处理(也就是半透明)。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/WrapGAPI2.asp

这篇文章实现了点、线和从 8 位位图转换而来的自定义 1 位字体的绘制,从而扩展了“Dancing Zombies”示例。它还实现了一个重写硬件按钮功能和跟踪按钮状态的输入系统。
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/WrapGAPI3.asp

3. 部署

3.1. 如何创建基于 Windows Mobile 的 Pocket PC 安装应用程序?

这篇文章介绍了如何创建一个 .msi 文件,它可以从桌面运行,并在其他基于 Windows Mobile 的 Pocket PC
设备上安装应用程序。此开发过程是自动化的,所以它可以轻松地构建所有必需的组件并将其包装在 .msi 文件中。这篇文章提供了 C# 和
Microsoft Visual Basic .NET 的示例代码。

http://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfdeployment.asp

3.2. 应用程序安装中可以包括哪些可重新发布的文件?

您可以将最终用户可重新发布的文件随应用程序提供给您的客户,以便帮助他们更新设备。您不应该解开最终用户可重新发布的文件并将其中的内容发送给您的客户。不过您可以解开开发人员可重新发布的文件并将其中的内容发送给您的客户。

.NET Compact Framework 可重新发布的包可以在这里下载:
http://msdn.microsoft.com/mobility/downloads/updates/default.aspx

3.3. 如何在桌面上创建不需要 .NET Framework 的安装程序?

创建 INF 文件

基于 Windows Mobile 的 Pocket PC 安装程序的主要组件之一是 INF 文件。此文件描述了需要复制哪些文件以及需要为不同的目标平台创建哪些注册表项。

此 INF 文件是一个文本文件,它分成几节。每节都有一个节头,位于方括号中,它可以有几个仅与特定目标硬件类型相关的子节。

只要有子节,子节的优先级就高于父节,所以如果一个值在节及其子节中都进行了设置,则会使用子节中的值。基于这个原因,应该将共享设置放在父节中,而将特定于每个硬件配置的设置放在子节中。

请按照以下步骤创建 INF 文件:

在 [Version] 节中,将 Provider 值设置为您公司的名称。

在 [CEStrings] 节中,将. AppName 和 CompanyName 变量设置为应用程序名称和公司名称(不带空格)。

在 [Strings] 节中,您可能不需要进行任何更改,但要注意不同的 CPU 类型。

在 [DefaultInstall] 节中,列出应该调用的不同节,方法是将 CopyFiles、AddReg 和 CEShortcuts 值设置为不同的节名。如果有多个节,节名间应该以逗号分隔。


[SourceDiskFiles] 节中,列出要从 [SourceDiskNames]
节复制的各个文件和相应的编号。应该将这些编号看作是组编号,而非物理磁盘编号。通常文件是按类型分组的,例如“声音文件”、“图形文件”、“数据库文件
”等等,但如何分组由您决定。


[DestinationDirs] 节中,为 [SourceDiskFiles]
节中的每种文件类型指定一个目标目录。请注意,有一些预定义的变量可供您使用,例如 CE1(指定的目标目录)和 CE2(WINDOWS
目录),所以指定诸如“%CE1%/Database”这样的目录将会在用户安装时选择的目录下创建一个子目录。

为 [DefaultInstall] 节的 CopyFiles 变量中的每一项创建节(名称必须严格匹配,所以要检查再检查)。在每一节中,指定文件的名称及用于复制文件的属性。属性可以在 eMbedded Visual Tools 文档中找到。

为 [DefaultInstall] 节的 RegSettings 变量中的每一项创建节。

为 [DefaultInstall] 节的 Shortcuts 变量中的每一项创建节。%CE17% 预定义变量表示 /WINDOWS/Start Menu 目录。

创建 CAB 文件

Cabinet 文件是高度压缩的文件,由包括在 eMbedded Visual Tools 中的 CABWIZ 实用工具构建。

CABWIZ 实用工具具有以下形式:

CABWIZ  [/err ] /cpu

/cpu 参数后面的每一项将创建一个文件名为 YOURAPP.CPUTYPE.CAB 的独立 CAB 文件。每个 CAB 文件只包含压缩文件和用于匹配设备类型的设置。

创建 INI 文件

客户的个人计算机并没有读取 CAB 文件的内容;它只是将适当的 CAB 文件复制到基于 Windows Mobile 的 Pocket
PC 中,然后由后者读取该 CAB 文件并使用 WCELOAD.EXE 应用程序提取内容。在这台个人计算机中,有一个名为
CEAPPMGR.EXE 的实用工具,它协调设备的安装、将设备类型与每个可用的 CAB 文件类型相匹配、将 CAB 文件发送到设备,并调用基于
Windows Mobile 的 Pocket PC 设备中的 WCELOAD.EXE 应用程序。

请注意,可以指定多个 INI 文件,这样将安装多个组件。这将允许使用基于 Windows Mobile 的 Pocket PC 中的 Remove Programs(位于“System
”选项卡的 Settings 下)来删除个别组件。

小结

一旦您使用 CAB 文件、SETUP.INI 文件和一个 SETUP.EXE 文件来调用 CE Application
Manager,您只需将这些文件放在光盘、磁盘或 ZIP
文件中,将它们分发给您的客户。理解获取这些文件的所需步骤可能会占用您第一次安装的大量时间,但以后的安装将会很快,因为您只需更改任何前面安装的源文
件中的少量值即可。

3.4. 如何创建与基于 Windows Mobile 的 Pocket PC 平台无关的 CAB 文件?

您可以创建一个 .inf 文件,用它生成适合在任何基于 Windows Mobile 的 Pocket PC 设备上安装应用程序的 CAB 文件。具体做法请参见这个示例:
http://samples.gotdotnet.com/quickstart/CompactFramework/doc/cabfile.aspx

3.5. 为什么每种处理器类型都有不同的 CAB 文件?

每个 CAB 都包含一个小型本机可执行文件,它在设备中执行框架依赖项检测。此实用工具特定于处理器/平台,每种处理器类型都必须有单独的 CAB。

3.6. 如何创建一个桌面安装程序来检测目标设备中是否存在 .NET Compact Framework,并在需要时安装它?

MSDN Library 中标题为“Creating an MSI Package that Detects and Updates the .NET Compact Framework”的文章描述了一种可能会用到的技术:
http://msdn.microsoft.com/mobility/understanding/articles/default.aspx?pull=/library/en-us/dnnetcomp/html/netcfdepl.asp

3.7. 如何将 .NET Compact Framework Service Pack 部署到模拟器中?

从以下地址下载“Developer”版本的 service pack 并安装到您的桌面开发 PC 中(下载的标题如下所示:“Microsoft® .NET Compact Framework 1.0 SPx Developer

Redistributable”)
http://msdn.microsoft.com/mobility/downloads/updates/default.aspx

然后将适当的 .NET Compact Framework cab 文件复制到模拟器中(按照下一段)。在模拟器中通过 File
Explorer 指向 PC 中的一个共享,然后将该 cab 复制并粘贴到模拟器文件系统中的某个位置。现在从 File Explorer
启动该 cab 文件,如果询问是否覆盖所有项,则回答“是”。

模拟器 CAB 文件

Windows Mobile 2002 for Pocket PC

netcf.core.ppc3.x86.cab

Windows Mobile 2003 for Pocket PC

netcf.core.wce4.x86.cab

Windows Mobile 2003 for Smartphone

不支持 RAM 安装

3.8. 如何将 SQL Server CE 包含在我的应用程序安装中?

要随一个应用程序安装 SQL Server CE,只需将恰当的 SQL Server CE CAB 文件作为应用程序安装的一部分加以安装。有两组与 SQL Server CE 相关的 cab。

开发人员 CAB 包括查询分析器和错误字符串。此 CAB 不应该包括在应用程序部署中。它包含在两个实际的文件中,一个用于基于 Windows Mobile 的 Pocket PC,一个用于 Windows CE 4.x 设备:

sqlce.dev.ppc3..cabsqlce.dev.wce4..cab

SQL Server CE CAB,它包括引擎、客户端代理和托管扩展,因为利用 System
.Data.SqlServerCe 组件的应用程序需要客户端代理。此 CAB 也包含在两个实际的文件中,一个用于基于 Windows Mobile 的 Pocket PC,一个用于 Windows CE 4.x 设备:

sqlce.ppc3..cabsqlce.wce4..cab

访问 SQL Server 的应用程序,也就是利用 System
.Data.SqlClient 组件的应用程序应该部署该“sql”CAB。此 CAB 也包含在两个实际的文件中,一个用于基于 Windows Mobile 的 Pocket PC,一个用于 Windows CE 4.x 设备:

sql.ppc3..cabsql.wce4..cab

所有这些 CAB 都包含在 Visual Studio .NET 2003 Professional Edtion 安装中。默认位置为:

/Program Files/Microsoft Visual Studio .NET 2003/CompactFrameworkSDK/v1.0.5000/Windows CE/...

3.9. 如何在启动时运行我的应用程序?

在 /Windows/Startup 中安装应用程序的快捷方式

在 HKLM/Init 中添加一个注册表项

P/Invoke CeRunAppAtEvent

3.10. 如何通过桌面安装程序检测 .NET Compact Framework 的版本?

请参考文章“Creating an MSI Package that Detects and Updates the .NET Compact Framework”:
http://msdn.microsoft.com/library/en-us/dnnetcomp/html/netcfdepl.asp

具体为:

检测 Microsoft .NET Compact Framework
您需要创建一个 .dll,它可以作为自定义操作从 MSI 文件调用。

首先使用 CeRapiInitEx 连接到设备。

使用 CeFindAllFiles 搜索设备的 Windows 目录中是否存在 GAC_mscorlib_*.dll。如果存在,则设备中已经安装了某种风格的 .NET Compact Framework。

查询设备注册表并枚举 HKLM/SOFTWARE/Microsoft/.NETCompactFramework
中的值。您应该找到表示现有 .NET Compact Framework 的内部版本的注册表项。(比如
1.0.2268.00:REG_DWORD:0)。此版本是由所有 .cab 安装创建的,并包含在以后所有 ROM 安装中。最初 ROM 安装的
RTM .NET Compact Framework 缺少这一项,所以如果您没有找到它,就假定它的值为 1.0.2268.0。

有关版本号的更多信息,请参见本 FAQ 中标题为“1.26.如何确定设备中安装的 .NET Compact Framework 的版本”的项。

4. 图形用户界面 (GUI):窗体

4.1. 如何创建全屏窗体?

您需要将 WindowState 属性设置为 Maximized。要创建“不可见”窗体,如同在窗体中的一个全屏图像,您还需要将 FormBorderStyle 设置为 None

抱歉!评论已关闭.