【问题标题】:Handling Different Resolutions in Visual Studio 2008 for .NET CF在 Visual Studio 2008 for .NET CF 中处理不同的分辨率
【发布时间】:2008-11-18 05:54:27
【问题描述】:

我正在开发一个基于 .NET CF 的图形应用程序,我的项目涉及很多绘图图像,我们决定将应用程序移植到不同的手机分辨率上。(240 X 240 , 480 X 640)等。

我将如何在单个解决方案/项目中实现这一目标?

是否需要根据分辨率创建不同的项目? 我将如何处理常见文件?并且我需要在所有设备上发生其中一个常见类的更改。

谢谢你, 克罗诺斯

【问题讨论】:

    标签: c# visual-studio compact-framework


    【解决方案1】:

    不要听那个白痴MusiGenesis。为 Windows Mobile 设备处理不同屏幕分辨率的更好方法是使用表单继承,它可以轻松地添加到现有的 CF 应用程序中。

    基本上,您为标准 240x320 屏幕设计每个表单。当您需要为新的分辨率(比如 240x240)重新排列表单时,您可以向项目中添加一个新表单,并让它继承您原来的 240x320 表单:

    public partial class frmDialog240x240: frmDialog
    

    而不仅仅是表格:

    public partial class frmDialog240x240: Form
    

    像往常一样。在您的原始表单上,您需要将每个控件的 Modifiers 属性设置为 Protected(而不是默认的 Private)。在新表单的设计器中,您将看到您继承的表单上的所有控件,您可以移动它们并调整它们的大小以适应新的屏幕尺寸(这不会影响原始表单的布局)。

    当您的程序运行时,它很容易检查正在运行的设备的屏幕分辨率并创建适当的表单(工厂方法对此很有用)。您的新表单继承了旧表单的所有内容,但使用了新的自定义布局。

    这种方法可以避免代码重复,因为没有。

    【讨论】:

    • 我尝试了继承的方法并没有走得很远,主要是由于设计师的问题。我求助于对接并获得了不错的结果。
    • @cdonner:您是否将父窗体上每个控件的修饰符属性设置为受保护(而不是私有)?这是让设计师正常工作的关键。
    【解决方案2】:

    锚定和停靠是处理不同分辨率的最常用机制(还请记住,许多设备可以旋转屏幕,因此即使在单个设备上您也需要处理更改)。之后如果需要,获取屏幕大小就像查询 Screen 对象一样简单:

    int screenWidth = Screen.PrimaryScreen.Bounds.Width;
    int workingHeight = Screen.PrimaryScreen.WorkingArea.Height;
    

    【讨论】:

      【解决方案3】:

      此代码在动态确定屏幕分辨率方面对我有用:

      [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 窗体应用程序项目的引用。

      【讨论】:

        【解决方案4】:

        这个问题没有简单的答案。在 Windows 中设计处理不同屏幕分辨率的表单很容易,即使最小的屏幕尺寸通常为 600 x 800。在 CF 世界中,屏幕可以小至 240 x 240(智能手机更小)或大至640 x 480(或更大)。在这些大小范围内,锚定和对接往往效果不佳。

        一种选择是使用最小公分母方法并设计所有内容以适应最小的屏幕。这保证适用于所有设备,但显然会浪费大屏幕上的有用空间。

        另一种选择是将每个表单设计为可感知分辨率。例如,如果您有一个在网格中显示数据的表单和一个在其上方的过滤器组合框,您可以在表单的 Resize 事件中编写代码来调整网格的尺寸以填充任何可用空间。

        分辨率感知代码的另一种选择是为特定 UI 功能的每个分辨率创建单独的表单。当然,这是更多的工作并导致代码重复,但对于某些特定功能,这只是您必须做的事情。只要你把通用逻辑抽象出来就可以了。

        您希望在单个项目中实现这一目标的想法是正确的。不同的屏幕分辨率通常可以通过一些工作和思考来处理,绝对不是将您的产品分成不同项目的理由。

        【讨论】:

        • 请看我的新答案。我深入研究了这个问题,发现了一种更好的处理屏幕分辨率的方法。
        【解决方案5】:

        除了最基本的紧凑型应用程序之外,我放弃了所有设计器。我尝试使用屏幕尺寸以数学方式放置每个控件。这听起来很痛苦,但一旦你开始,它就会成为第二天性。

        对于每个表单,我都会创建一个“重新生成”方法,只要表单显示或调整大小,就会触发该方法。在该方法中,我通常为表单上的每个控件设置位置、大小以及(如有必要)字体大小。放置控件时,我的思考过程是:

        1. 常规肖像设备还可以吗?
        2. 常规横向设备还可以吗?
        3. 方形设备可以吗?
        4. 适用于 VGA (640x480)(高 DPI)设备?

        对于字体大小和处理高 DPI(每英寸点数)VGA 设备,我使用属性 -:

        CurrentAutoScaleDimensions.Height / 96

        ...产生一个字体缩放因子。 (常规设备为 96 DPI)

        作为最后的手段,您可以在重新生成代码中使用条件 (if) 语句来测试各种屏幕尺寸/形状。

        仍然可以使用设计器进行基本布局,但您需要在各种模拟器/设备上运行表单并尝试切换纵向/横向以全面测试“重新生成”方法。

        【讨论】:

          猜你喜欢
          • 2011-11-11
          • 1970-01-01
          • 2021-06-10
          • 2014-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-07
          相关资源
          最近更新 更多