我正在开发一个基于 .NET CF 的图形应用程序,我的项目涉及很多绘图图像,我们决定将应用程序移植到不同的手机分辨率上。(240 X 240、480 X 640)等。
我将如何在单个解决方案/项目中实现这一目标?
是否需要根据分辨率创建不同的项目?我将如何处理常见文件?我需要在所有设备上发生一个常见类的更改。
谢谢你,克罗诺斯
我正在开发一个基于 .NET CF 的图形应用程序,我的项目涉及很多绘图图像,我们决定将应用程序移植到不同的手机分辨率上。(240 X 240、480 X 640)等。
我将如何在单个解决方案/项目中实现这一目标?
是否需要根据分辨率创建不同的项目?我将如何处理常见文件?我需要在所有设备上发生一个常见类的更改。
谢谢你,克罗诺斯
不要听那个白痴MusiGenesis。为 Windows Mobile 设备处理不同屏幕分辨率的一种更好的方法是使用表单继承,它可以轻松地添加到现有的 CF 应用程序中。
基本上,您为标准 240x320 屏幕设计每个表单。当您需要为新的分辨率(比如 240x240)重新排列表单时,您可以向项目中添加一个新表单,并让它继承您原来的 240x320 表单:
public partial class frmDialog240x240: frmDialog
而不仅仅是形式:
public partial class frmDialog240x240: Form
像往常一样。在您的原始表单上,您需要将每个控件的 Modifiers 属性设置为 Protected(而不是默认的 Private)。在新表单的设计器中,您将看到您继承的表单上的所有控件,您可以移动它们并调整它们的大小以适应新的屏幕尺寸(这不会影响原始表单的布局)。
当你的程序运行时,它很容易检查它正在运行的设备的屏幕分辨率并创建适当的表单(工厂方法对此很有用)。您的新表单继承了旧表单的所有内容,但使用了新的自定义布局。
这种方法可以避免代码重复,因为没有任何重复。
锚定和停靠是处理不同分辨率的最常用机制(还请记住,许多设备可以旋转屏幕,因此即使在单个设备上您也需要处理更改)。之后如果需要,获取屏幕大小就像查询 Screen 对象一样简单:
int screenWidth = Screen.PrimaryScreen.Bounds.Width;
int workingHeight = Screen.PrimaryScreen.WorkingArea.Height;
这段代码在动态确定屏幕分辨率方面对我有用:
[DllImport("coredll.dll", EntryPoint = ("GetSystemMetrics"))]
public static extern int GetSystemMetrics(int nIndex);
private const int SM_CXSCREEN = 0;
private const int SM_CYSCREEN = 1;
private int width = GetSystemMetrics(SM_CXSCREEN);
private int height = GetSystemMetrics(SM_CYSCREEN);
我不记得它了,但是还有一种方法可以获取屏幕方向。这些将有助于将一些代码合并到一个类中。
我强烈建议为所有分辨率创建一个单一的解决方案。在这些解决方案下,您可以拥有任意数量的项目。这些项目可以是 Windows 窗体应用程序、Dll 库项目或设置项目。
我的目标是创建一个单一的 Windows 窗体应用程序项目。我将使用上述技术并从文件系统中读取静态图像。如果这对您不起作用和/或您更喜欢将图像作为资源读取,则创建一个“引擎”dll 项目,其中包含所有分辨率通用的所有代码。然后添加此项目的输出作为对您需要的任意数量的 Windows 窗体应用程序项目的引用。
这个问题没有简单的答案。在 Windows 中设计处理不同屏幕分辨率的表单很容易,即使最小的屏幕尺寸通常为 600 x 800。在 CF 世界中,屏幕可以小至 240 x 240(智能手机更小)或大至640 x 480(或更大)。在这些尺寸范围内,锚定和对接往往效果不佳。
一种选择是使用最小公分母方法并设计所有内容以适应最小的屏幕。这保证适用于每台设备,但显然会浪费大屏幕上的有用空间。
另一种选择是将每个表单设计为具有分辨率感知能力。例如,如果您有一个在网格中显示数据的表单和一个在其上方的过滤器组合框,您可以在表单的 Resize 事件中编写代码来调整网格的尺寸以填充任何可用空间。
分辨率感知代码的另一种选择是为特定 UI 功能的每个分辨率创建单独的表单。当然,这是更多的工作并导致代码重复,但对于某些特定功能,这只是您必须做的事情。只要你抽象出常见的逻辑,你就可以了。
您希望在单个项目中实现这一目标是正确的。不同的屏幕分辨率通常可以通过一些工作和思考来处理,并且绝对不是将您的产品拆分为不同项目的理由。
除了最基本的紧凑型应用程序之外,我放弃了设计器。我尝试使用屏幕尺寸以数学方式放置每个控件。这听起来很痛苦,但一旦你开始,它就会成为第二天性。
对于每个表单,我都会创建一个“重新生成”方法,只要表单显示或调整大小就会触发该方法。在该方法中,我通常为表单上的每个控件设置位置、大小以及(如有必要)字体大小。放置控件时,我的思考过程是:
对于字体大小和处理高 DPI(每英寸点数)VGA 设备,我使用属性 -:
CurrentAutoScaleDimensions.Height / 96
...产生一个字体缩放因子。(常规设备为 96 DPI)
作为最后的手段,您可以在重新生成代码中使用条件 (if) 语句来测试各种屏幕尺寸/形状。
仍然可以使用设计器进行基本布局,但您需要在各种模拟器/设备上运行表单并尝试切换纵向/横向以全面测试“重新生成”方法。