3

我有一个在 .Net Compact Framework 1.0 中开发的大型应用程序,该应用程序在过去 9 年中已经开发出大量表单和自定义控件。该应用程序专为 240x320 屏幕而设计。当使用 Compact .Net 1.0 和 Visual Studio 2003 编译时,它可以很好地扩展到 480x640 屏幕。

我使用 Visual Studio 2008 的默认升级向导将应用程序升级到 .Net 2.0。当使用分辨率为 240x320 的设备时,应用程序使用全屏并且所有控件都按设计布局。但在使用分辨率为 480x640 的设备时,应用程序仅使用屏幕左上角的 25%。

我尝试使用代码: AutoScaleDimensions = new SizeF(96,96); AutoScaleMode = AutoScaleMode.Dpi;

它适用于表单,但不适用于放置在表单上的动态控件(标准/自定义)。

有没有办法强制应用程序使用类似于使用 .Net 1.0 编译时所做的缩放,而不使用 AutoScaleDimensions/AutoScaleMode 属性。

谢谢。

4

2 回答 2

3

听起来您创建自定义控件的代码包含假设特定 DPI 的硬编码值,可能是使用的设计器,96。

您可以使用以下方法分析运行应用程序的设备的主机分辨率:

const float designResolution = 96.0f; 
float scaleFactor;

System.Drawing.Graphics g = f.CreateGraphics();
float runningResolution = g.DpiX;
scaleFactor = runningResolution / designResolution;
g.Dispose();

然后,您将修改代码中创建动态控件的任何硬编码坐标,以使用计算的 scaleFactor 调整值,例如:

const int controlY = 8;
int yPosition = (int)(controlY * scaleFactor);
于 2010-10-19T16:26:23.427 回答
2

我找到了解决这个问题的一种方法。

我得到了类似于simons19解释的过程的比例因子,然后在将任何动态创建的控件添加到表单时,我调用方法 control.Scale(scale-factor)。这解决了我的问题。Scale 方法同时缩放控件的位置和大小,因此,我在调用缩放属性之前设置了动态创建的控件的位置属性和大小属性。

例子:

Label lblTest = new Label();
lblTest.Text = "A Test Label";
lblTest.Location = new Point(10, 5);  //Designed in relation to a 96 dpi screen
lblTest.Size = new Size(30, 10);      //Size Designed in relation to 96 DPI screen
parentControl.Controls.Add(lblTest);
//Scale Factor is calculated as mentioned by simons19
lblTest.Scale(scaleFactor);           //Scale the control to the screen DPI.
于 2010-10-20T16:04:43.633 回答