为 .NET Compact Framework 开发能够识别方向和 dpi 的应用程序
摘要:本文介绍用于为 .NET Compact Framework 创建能够识别方向和 dpi 的应用程序的技术。
从 Microsoft 下载中心下载 Webcrawler.msi。
本页内容
简介
添加方向识别
添加高分辨率识别
小结
简介
本文介绍用于为 .NET Compact Framework 创建能够识别方向和 dpi 的应用程序的技术。要了解在解决这些新情况时所涉及的设计问题,您需要阅读 Developer Resources for Windows Mobile 2003 Second Edition(它提供了一般用户界面指南)中提供的开发屏幕方向识别和开发能够识别 DPI 的应用程序。
返回页首
添加方向识别
简介
Windows Mobile 2003 Second Edition 软件支持具有横向和方屏幕显示器的设备。这是对早期 Pocket PC 上传统的仅纵向显示器的附加功能。当在方形或横向显示器上运行为纵向显示器设计的应用程序时,操作系统将自动向窗体添加一个纵向滚动条,以便使用户能够查看整个窗体。仅当有一个控件由于迁移到横向而向用户隐藏时,才会发生这种情况。在大多数情况下,这不是用户界面在横向显示器上显示的理想方式。另外还有两种替代方式,一个是创建能够在两个方向下正常工作的单个界面布局,另一个是为每个方向创建一个单独的界面布局。
要使用单个布局在所有三个方向下正常工作,请对窗体进行排列,以便所有控件都位于一个方形的 240x240 区域中,如图 1 所示。这是最容易实现的解决方案,但它可能无法满足复杂窗体的需要。

图 1. 具有被设置为方形区域的控件的纵向和横向显示器。
要充分利用纵向和横向这两个方向,必须为每个方向定义单独的布局。此外,还必须使用 Form.Resize 事件来确定当前的方向,并根据需要重新定位控件。
注在大多数情况下,没有必要为方形屏幕创建自定义布局。相反,可以使用纵向布局,并且系统将自动为其添加垂直滚动条。
为每个方向创建单独的布局代码
为这两个方向中的每一个定义一个函数。在这些函数中,设置窗体上每个控件的 Size 和 Location 属性。
下面的示例说明了如何更新 Visual Studio .NET 2003 中随附的 WebCrawler 示例,以使其能够识别方向。可以将相同的步骤应用于任何现有应用程序或新应用程序,以使其能够识别方向。 字串2
Visual Studio .NET 2003 窗体设计器不显式支持多个布局的创建,但仍然可以将其用作工具,以帮助您使用以下过程创建相应的代码:
1.
使用设计器为纵向显示器创建布局。
2.
查看该设计器生成的代码。该代码位于一个名为 InitializeComponent 的函数中,可以通过展开“Windows 窗体设计器生成的代码”区域找到。
3.
创建一个名为 Portrait() 并以纵向模式定位控件的新函数,并且将用于设置控件的 Location 和 Size 属性的代码从 InitializeComponent 复制到 Portrait() 中。
4.
使用该设计器以横向模式所需的布局重新定位控件。
5.
使用该设计器为横向模式生成的定位代码来重复执行步骤 3。
protected void Portrait()
{
this.crawlTime.Location = new System.Drawing.Point(88, 216); 字串2
this.crawlTime.Size = new System.Drawing.Size(136, 16);
this.crawlTimeLabel.Location = new System.Drawing.Point(10, 216);
this.crawlTimeLabel.Size = new System.Drawing.Size(64, 16);
this.crawlStartTime.Location = new System.Drawing.Point(88, 200);
this.crawlStartTime.Size = new System.Drawing.Size(136, 16);
this.crawlStartedLabel.Location = new System.Drawing.Point(10, 200);
this.crawlStartedLabel.Size = new System.Drawing.Size(64, 16);
this.light1.Location = new System.Drawing.Point(208, 66);
this.light1.Size = new System.Drawing.Size(16, 16);
this.light0.Location = new System.Drawing.Point(192, 66);
this.light0.Size = new System.Drawing.Size(16, 16);
this.linkCount.Location = new System.Drawing.Point(88, 182);
this.linkCount.Size = new System.Drawing.Size(136, 16); 字串8
this.linkCountLabel.Location = new System.Drawing.Point(10, 182);
this.linkCountLabel.Size = new System.Drawing.Size(64, 16);
this.currentPageBox.Location = new System.Drawing.Point(10, 84);
this.currentPageBox.Size = new System.Drawing.Size(214, 90);
this.currentPageLabel.Location = new System.Drawing.Point(10, 68);
this.currentPageLabel.Size = new System.Drawing.Size(100, 16);
this.addressLabel.Location = new System.Drawing.Point(10, 4);
this.addressLabel.Size = new System.Drawing.Size(214, 16);
this.noProxyCheck.Location = new System.Drawing.Point(10, 48);
this.noProxyCheck.Size = new System.Drawing.Size(214, 20);
this.startButton.Location = new System.Drawing.Point(8, 240);
this.startButton.Size = new System.Drawing.Size(216, 20);
this.addressBox.Location = new System.Drawing.Point(10, 24);
this.addressBox.Size = new System.Drawing.Size(214, 22);
}
protected void Landscape()
{
this.crawlTime.Location = new System.Drawing.Point(216, 136);
this.crawlTime.Size = new System.Drawing.Size(96, 16);
this.crawlTimeLabel.Location = new System.Drawing.Point(160, 136);
this.crawlTimeLabel.Size = new System.Drawing.Size(48, 16);
this.crawlStartTime.Location = new System.Drawing.Point(64, 120);
this.crawlStartTime.Size = new System.Drawing.Size(248, 16);
this.crawlStartedLabel.Location = new System.Drawing.Point(8, 120);
this.crawlStartedLabel.Size = new System.Drawing.Size(48, 16);
this.light1.Location = new System.Drawing.Point(296, 48);
this.light1.Size = new System.Drawing.Size(16, 16);
this.light0.Location = new System.Drawing.Point(280, 48); 字串6
this.light0.Size = new System.Drawing.Size(16, 16);
this.linkCount.Location = new System.Drawing.Point(80, 136);
this.linkCount.Size = new System.Drawing.Size(72, 16);
this.linkCountLabel.Location = new System.Drawing.Point(8, 136);
this.linkCountLabel.Size = new System.Drawing.Size(64, 16);
this.currentPageBox.Location = new System.Drawing.Point(10, 64);
this.currentPageBox.Size = new System.Drawing.Size(302, 48);
this.currentPageLabel.Location = new System.Drawing.Point(10, 48);
this.currentPageLabel.Size = new System.Drawing.Size(100, 16);
this.addressLabel.Location = new System.Drawing.Point(10, 4);
this.addressLabel.Size = new System.Drawing.Size(50, 16);
this.noProxyCheck.Location = new System.Drawing.Point(168, 16);
this.noProxyCheck.Size = new System.Drawing.Size(152, 24); 字串3
this.startButton.Location = new System.Drawing.Point(8, 160);
this.startButton.Size = new System.Drawing.Size(304, 20);
this.addressBox.Location = new System.Drawing.Point(10, 20);
this.addressBox.Size = new System.Drawing.Size(150, 22);
}
处理方向的更改
要应用这两个布局函数,请为窗体的 Resize 事件创建一个事件处理程序。在该事件处理程序中,新的方向将调用相应的布局函数。
private void MainForm_Resize(object sender, System.EventArgs e)
{
if(Screen.PrimaryScreen.Bounds.Width>Screen.PrimaryScreen.Bounds.Height)
{
Landscape();
}
else
{
Portrait();
}
}
彻底检验 字串8
要测试程序处理方向更改的能力,请向 Rotate Screen 函数分配一个硬件按钮。您可以在控制面板中的“按钮”项目下完成该工作。选择您希望重新分配的按钮,然后选择 Button Assignment 下拉菜单中的 Rotate Screen。然后,您可以在一个方向下运行您的程序,然后使用该按钮即时切换方向。
您还可以在控制面板中更改 Screen 属性;它位于“系统”选项卡下。
返回页首
添加高分辨率识别
简介
Windows Mobile 2003 Second Edition 软件将自动调整 .NET Compact Framework 窗体上的控件的大小,以便利用高 dpi 显示。在绝大多数情况下,这都可以满足需要。但是,有时需要自定义应用程序响应高 dpi 的方式。例如,如果应用程序涉及到自定义图形或者要求在单个屏幕上显示大量控件,则可以由于支持高 dpi 而获益。
注在创建高 dpi 布局时,必须小心使用使控件变小的功能。较小的控件可能更加难以辨认,并且用户很难使用笔针与其进行交互。
您可以使用与添加方向识别类似的方法来为高 dpi 显示器创建单独的布局。您需要为高 dpi/低 dpi 和横向/纵向这四种组合创建新的函数。此外,可以扩展 Form.Resize 事件处理程序,以根据需要调用每种组合。 字串7
注 Visual Studio .NET 2003 窗体设计器不会为高 dpi 显示器生成布局代码,开发人员必须手动创建相应的代码。
完成该工作后,必须将可执行文件标记为能够识别 dpi,以防止操作系统自动调整控件的大小。在使用 res2exe 工具编译可执行文件之后,可以通过向其添加 Win32 资源文件来做到这一点。
使用 Res2exe
? 将 res2exe.exe 和 hidpi.res 放入 Visual Studio .NET 2003 的命令行路径中。默认情况下,这些文件将安装到名为 Res2Exe Power Toy 的子目录中,该子目录位于本文随附示例的安装目录下。
? 使用 Visual Studio .NET 2003 编译您的应用程序
? 从命令行中,使用下面的语法对输出可执行文件运行 res2exe:
? res2exe -c -r hidpi.res [EXE file]
注 如果您要使用 signcode 对您的可执行文件进行签名(例如,如果您要面向 Smartphone 2003),则需要在对应用程序进行签名“之前”使用 res2exe。如果您在对应用程序进行签名之后使用 res2exe,则该签名将呈现为无效签名。 字串6
彻底检验
? 使用 Visual Studio.NET 2003 生成输出文件(单击 Build,然后单击 Build Solution)
? 对项目的 objDebug 子目录中的可执行文件版本使用 res2exe。
在 Visual Studio.NET 2003 中选择一个“VGA”模拟器(如图 2 所示),然后启动调试器。

图 2. 在 Visual Studio .NET 中选择 VGA 模拟器。
返回页首
小结
要在 .NET Compact Framework 中支持方向识别,只需创建“纵向”和“横向”布局代码。尽管大多数 .NET Compact Framework 应用程序不需要实现高 dpi 支持,但您可以使用类似的方法添加分辨率识别功能。
从 Microsoft 下载中心下载 Webcrawler.msi。
本页内容
简介
添加方向识别
添加高分辨率识别
小结
简介
本文介绍用于为 .NET Compact Framework 创建能够识别方向和 dpi 的应用程序的技术。要了解在解决这些新情况时所涉及的设计问题,您需要阅读 Developer Resources for Windows Mobile 2003 Second Edition(它提供了一般用户界面指南)中提供的开发屏幕方向识别和开发能够识别 DPI 的应用程序。
返回页首
添加方向识别
简介
Windows Mobile 2003 Second Edition 软件支持具有横向和方屏幕显示器的设备。这是对早期 Pocket PC 上传统的仅纵向显示器的附加功能。当在方形或横向显示器上运行为纵向显示器设计的应用程序时,操作系统将自动向窗体添加一个纵向滚动条,以便使用户能够查看整个窗体。仅当有一个控件由于迁移到横向而向用户隐藏时,才会发生这种情况。在大多数情况下,这不是用户界面在横向显示器上显示的理想方式。另外还有两种替代方式,一个是创建能够在两个方向下正常工作的单个界面布局,另一个是为每个方向创建一个单独的界面布局。
字串5
要使用单个布局在所有三个方向下正常工作,请对窗体进行排列,以便所有控件都位于一个方形的 240x240 区域中,如图 1 所示。这是最容易实现的解决方案,但它可能无法满足复杂窗体的需要。

图 1. 具有被设置为方形区域的控件的纵向和横向显示器。
要充分利用纵向和横向这两个方向,必须为每个方向定义单独的布局。此外,还必须使用 Form.Resize 事件来确定当前的方向,并根据需要重新定位控件。
注在大多数情况下,没有必要为方形屏幕创建自定义布局。相反,可以使用纵向布局,并且系统将自动为其添加垂直滚动条。
为每个方向创建单独的布局代码
为这两个方向中的每一个定义一个函数。在这些函数中,设置窗体上每个控件的 Size 和 Location 属性。
下面的示例说明了如何更新 Visual Studio .NET 2003 中随附的 WebCrawler 示例,以使其能够识别方向。可以将相同的步骤应用于任何现有应用程序或新应用程序,以使其能够识别方向。 字串2
Visual Studio .NET 2003 窗体设计器不显式支持多个布局的创建,但仍然可以将其用作工具,以帮助您使用以下过程创建相应的代码:
1.
使用设计器为纵向显示器创建布局。
2.
查看该设计器生成的代码。该代码位于一个名为 InitializeComponent 的函数中,可以通过展开“Windows 窗体设计器生成的代码”区域找到。
3.
创建一个名为 Portrait() 并以纵向模式定位控件的新函数,并且将用于设置控件的 Location 和 Size 属性的代码从 InitializeComponent 复制到 Portrait() 中。
4.
使用该设计器以横向模式所需的布局重新定位控件。
5.
使用该设计器为横向模式生成的定位代码来重复执行步骤 3。
protected void Portrait()
{
this.crawlTime.Location = new System.Drawing.Point(88, 216); 字串2
this.crawlTime.Size = new System.Drawing.Size(136, 16);
this.crawlTimeLabel.Location = new System.Drawing.Point(10, 216);
this.crawlTimeLabel.Size = new System.Drawing.Size(64, 16);
this.crawlStartTime.Location = new System.Drawing.Point(88, 200);
this.crawlStartTime.Size = new System.Drawing.Size(136, 16);
this.crawlStartedLabel.Location = new System.Drawing.Point(10, 200);
this.crawlStartedLabel.Size = new System.Drawing.Size(64, 16);
this.light1.Location = new System.Drawing.Point(208, 66);
this.light1.Size = new System.Drawing.Size(16, 16);
this.light0.Location = new System.Drawing.Point(192, 66);
this.light0.Size = new System.Drawing.Size(16, 16);
this.linkCount.Location = new System.Drawing.Point(88, 182);
this.linkCount.Size = new System.Drawing.Size(136, 16); 字串8
this.linkCountLabel.Location = new System.Drawing.Point(10, 182);
this.linkCountLabel.Size = new System.Drawing.Size(64, 16);
this.currentPageBox.Location = new System.Drawing.Point(10, 84);
this.currentPageBox.Size = new System.Drawing.Size(214, 90);
this.currentPageLabel.Location = new System.Drawing.Point(10, 68);
this.currentPageLabel.Size = new System.Drawing.Size(100, 16);
this.addressLabel.Location = new System.Drawing.Point(10, 4);
this.addressLabel.Size = new System.Drawing.Size(214, 16);
this.noProxyCheck.Location = new System.Drawing.Point(10, 48);
this.noProxyCheck.Size = new System.Drawing.Size(214, 20);
this.startButton.Location = new System.Drawing.Point(8, 240);
this.startButton.Size = new System.Drawing.Size(216, 20);
this.addressBox.Location = new System.Drawing.Point(10, 24);
字串2
this.addressBox.Size = new System.Drawing.Size(214, 22);
}
protected void Landscape()
{
this.crawlTime.Location = new System.Drawing.Point(216, 136);
this.crawlTime.Size = new System.Drawing.Size(96, 16);
this.crawlTimeLabel.Location = new System.Drawing.Point(160, 136);
this.crawlTimeLabel.Size = new System.Drawing.Size(48, 16);
this.crawlStartTime.Location = new System.Drawing.Point(64, 120);
this.crawlStartTime.Size = new System.Drawing.Size(248, 16);
this.crawlStartedLabel.Location = new System.Drawing.Point(8, 120);
this.crawlStartedLabel.Size = new System.Drawing.Size(48, 16);
this.light1.Location = new System.Drawing.Point(296, 48);
this.light1.Size = new System.Drawing.Size(16, 16);
this.light0.Location = new System.Drawing.Point(280, 48); 字串6
this.light0.Size = new System.Drawing.Size(16, 16);
this.linkCount.Location = new System.Drawing.Point(80, 136);
this.linkCount.Size = new System.Drawing.Size(72, 16);
this.linkCountLabel.Location = new System.Drawing.Point(8, 136);
this.linkCountLabel.Size = new System.Drawing.Size(64, 16);
this.currentPageBox.Location = new System.Drawing.Point(10, 64);
this.currentPageBox.Size = new System.Drawing.Size(302, 48);
this.currentPageLabel.Location = new System.Drawing.Point(10, 48);
this.currentPageLabel.Size = new System.Drawing.Size(100, 16);
this.addressLabel.Location = new System.Drawing.Point(10, 4);
this.addressLabel.Size = new System.Drawing.Size(50, 16);
this.noProxyCheck.Location = new System.Drawing.Point(168, 16);
this.noProxyCheck.Size = new System.Drawing.Size(152, 24); 字串3
this.startButton.Location = new System.Drawing.Point(8, 160);
this.startButton.Size = new System.Drawing.Size(304, 20);
this.addressBox.Location = new System.Drawing.Point(10, 20);
this.addressBox.Size = new System.Drawing.Size(150, 22);
}
处理方向的更改
要应用这两个布局函数,请为窗体的 Resize 事件创建一个事件处理程序。在该事件处理程序中,新的方向将调用相应的布局函数。
private void MainForm_Resize(object sender, System.EventArgs e)
{
if(Screen.PrimaryScreen.Bounds.Width>Screen.PrimaryScreen.Bounds.Height)
{
Landscape();
}
else
{
Portrait();
}
}
彻底检验 字串8
要测试程序处理方向更改的能力,请向 Rotate Screen 函数分配一个硬件按钮。您可以在控制面板中的“按钮”项目下完成该工作。选择您希望重新分配的按钮,然后选择 Button Assignment 下拉菜单中的 Rotate Screen。然后,您可以在一个方向下运行您的程序,然后使用该按钮即时切换方向。
您还可以在控制面板中更改 Screen 属性;它位于“系统”选项卡下。
返回页首
添加高分辨率识别
简介
Windows Mobile 2003 Second Edition 软件将自动调整 .NET Compact Framework 窗体上的控件的大小,以便利用高 dpi 显示。在绝大多数情况下,这都可以满足需要。但是,有时需要自定义应用程序响应高 dpi 的方式。例如,如果应用程序涉及到自定义图形或者要求在单个屏幕上显示大量控件,则可以由于支持高 dpi 而获益。
注在创建高 dpi 布局时,必须小心使用使控件变小的功能。较小的控件可能更加难以辨认,并且用户很难使用笔针与其进行交互。
您可以使用与添加方向识别类似的方法来为高 dpi 显示器创建单独的布局。您需要为高 dpi/低 dpi 和横向/纵向这四种组合创建新的函数。此外,可以扩展 Form.Resize 事件处理程序,以根据需要调用每种组合。 字串7
注 Visual Studio .NET 2003 窗体设计器不会为高 dpi 显示器生成布局代码,开发人员必须手动创建相应的代码。
完成该工作后,必须将可执行文件标记为能够识别 dpi,以防止操作系统自动调整控件的大小。在使用 res2exe 工具编译可执行文件之后,可以通过向其添加 Win32 资源文件来做到这一点。
使用 Res2exe
? 将 res2exe.exe 和 hidpi.res 放入 Visual Studio .NET 2003 的命令行路径中。默认情况下,这些文件将安装到名为 Res2Exe Power Toy 的子目录中,该子目录位于本文随附示例的安装目录下。
? 使用 Visual Studio .NET 2003 编译您的应用程序
? 从命令行中,使用下面的语法对输出可执行文件运行 res2exe:
? res2exe -c -r hidpi.res [EXE file]
注 如果您要使用 signcode 对您的可执行文件进行签名(例如,如果您要面向 Smartphone 2003),则需要在对应用程序进行签名“之前”使用 res2exe。如果您在对应用程序进行签名之后使用 res2exe,则该签名将呈现为无效签名。 字串6
彻底检验
? 使用 Visual Studio.NET 2003 生成输出文件(单击 Build,然后单击 Build Solution)
? 对项目的 objDebug 子目录中的可执行文件版本使用 res2exe。
在 Visual Studio.NET 2003 中选择一个“VGA”模拟器(如图 2 所示),然后启动调试器。

图 2. 在 Visual Studio .NET 中选择 VGA 模拟器。
返回页首
小结
要在 .NET Compact Framework 中支持方向识别,只需创建“纵向”和“横向”布局代码。尽管大多数 .NET Compact Framework 应用程序不需要实现高 dpi 支持,但您可以使用类似的方法添加分辨率识别功能。
Tags:
责任编辑:您的评论
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
精彩推荐
最新资讯


您的位置: