我有一个在.Net CompactFramework1.0中开发的大型应用程序,它是在过去9年开发的,具有大量的表单和自定义控件。应用程序是为240x320屏幕设计的。当使用CompactWeb1.0和Visual 2003编译时,它可以很好地扩展到480x640屏幕。
我使用Visual 2008的默认升级向导将应用程序升级到.Net 2.0。应用程序使用全屏,当使用分辨率为240x320的设备时,所有控件都按照设计的方式布置。但是,当使用分辨率为480x640的设备时,该应用程序只使用屏幕左上角的25%。
我尝试使用代码: AutoScaleDimensions =新SizeF(96,96);AutoScaleMode = AutoScaleMode.Dpi;
它在窗体上工作,但不工作于放置在窗体上的动态控件(标准/自定义)。
是否有一种方法可以强制应用程序使用与使用.Net 1.0时相同的缩放方式,而无需使用AutoScale维度/AutoScaleMode属性。
谢谢。
发布于 2010-10-20 16:04:43
我找到了解决这个问题的办法。
我得到类似于simons19解释的过程的比例因子,然后当向表单添加任何动态创建的控件时,我调用方法control.Scale( scale-factor )。这解决了我的问题。Scale缩放控件的位置和大小,因此,在调用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.发布于 2010-10-19 16:26:23
在听起来像是创建自定义控件的代码中,包含一些硬编码的值,这些值假设特定的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);https://stackoverflow.com/questions/3876353
复制相似问题