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