强制.NetCF 1.0将模型缩放到.NetCF 2.0应用程序

时间:2010-10-06 19:57:54

标签: c# compact-framework autoscalemode

我有一个在.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属性。

感谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

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

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

示例:

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.