楼主: bailuotuo

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

[复制链接]
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
21#
 楼主| 发表于 2006-9-5 10:08 | 只看该作者
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/librar ... dwebapplication.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

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
22#
 楼主| 发表于 2006-9-5 10:08 | 只看该作者
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/downloa ... &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/downloa ... &displaylang=en

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
23#
 楼主| 发表于 2006-9-5 10:08 | 只看该作者
1.37. 从哪里可以获得平台生成器目标控件窗口的 UI 版本?
从 Windows Mobile Developer Power Toys 下载 Jshell:
http://www.microsoft.com/downloa ... &displaylang=en

1.38. 从哪里可以获得用于基于 Windows Mobile 的 Pocket PC 2003 设备的命令外壳?
从 Windows Mobile Developer Power Toys 下载 PPC 命令外壳:
http://www.microsoft.com/downloa ... &displaylang=en

1.39. 如何获得当前运行进程的详细信息?
从 Windows Mobile Developer Power Toys 下载 RAPI Debug:
http://www.microsoft.com/downloa ... &displaylang=en

1.40. 如何从桌面远程启动基于 Windows Mobile 的 Pocket PC 上的应用程序?
从 Windows Mobile Developer Power Toys 下载 RAPI Start:
http://www.microsoft.com/downloa ... &displaylang=en

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
24#
 楼主| 发表于 2006-9-5 10:08 | 只看该作者
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/downloa ... &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)

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
25#
 楼主| 发表于 2006-9-5 10:09 | 只看该作者
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/qui ... 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)

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
26#
 楼主| 发表于 2006-9-5 10:09 | 只看该作者
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

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
27#
 楼主| 发表于 2006-9-5 10:09 | 只看该作者
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

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
28#
 楼主| 发表于 2006-9-5 10:10 | 只看该作者
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/librar ... /html/WrapGAPI1.asp

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

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

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
29#
 楼主| 发表于 2006-9-5 10:10 | 只看该作者
3.1. 如何创建基于 Windows Mobile 的 Pocket PC 安装应用程序?
这篇文章介绍了如何创建一个 .msi 文件,它可以从桌面运行,并在其他基于 Windows Mobile 的 Pocket PC 设备上安装应用程序。此开发过程是自动化的,所以它可以轻松地构建所有必需的组件并将其包装在 .msi 文件中。这篇文章提供了 C# 和 Microsoft Visual Basic .NET 的示例代码。


http://msdn.microsoft.com/librar ... netcfdeployment.asp

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

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

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
30#
 楼主| 发表于 2006-9-5 10:11 | 只看该作者
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 下)来删除个别组件。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表