编码我的项目进展顺利。但是今天我发现了一个问题。
我的主笔记本有全高清 (1920x1080) 分辨率,我正在这里编写我的项目。当我将主笔记本的分辨率更改为 1280x1024、1280x800 或 1024x768 时,没有问题。我的应用程序的分辨率是 1024x768,它没有崩溃。这是打印屏幕。
但我的另一台笔记本的分辨率为 1366x768。我正在这个笔记本上运行我的应用程序。哦!有一种失望。我的应用程序屏幕移动了。这是坏的打印屏幕。
我不懂为什么。我能做些什么来纠正这个错误?
编码我的项目进展顺利。但是今天我发现了一个问题。
我的主笔记本有全高清 (1920x1080) 分辨率,我正在这里编写我的项目。当我将主笔记本的分辨率更改为 1280x1024、1280x800 或 1024x768 时,没有问题。我的应用程序的分辨率是 1024x768,它没有崩溃。这是打印屏幕。
但我的另一台笔记本的分辨率为 1366x768。我正在这个笔记本上运行我的应用程序。哦!有一种失望。我的应用程序屏幕移动了。这是坏的打印屏幕。
我不懂为什么。我能做些什么来纠正这个错误?
它来自不同的 DPI 设置。您可以在表单加载中执行此操作:
// Get DPI width
float x = this.CreateGraphics().DpiX;
// If screen is width
if (x == 120)
// Get big image from Resources
this.BackgroundImage = Properties.Resources.BigImage;
else
// Get small image from Resources
this.BackgroundImage = Properties.Resources.SmallImage;
我在使用 Windows 窗体表单时遇到了同样的问题。我所要做的就是将表单的 AutoScaleMode 设置从 Font 更改为 DPI,并将 FormBorderStylefor 设置从 Fixed 更改为 Sizable。现在 Windows 窗体窗体可以在桌面和笔记本电脑上正确显示。
您可以检查两个屏幕的 DPI 设置是否相同。您可以通过控制面板或显示选项来执行此操作(我记不清了,而且我面前没有 Windows 7)(您的高清笔记本电脑上可能有 120 DPI,而另一台笔记本电脑上可能有标准 96 )。
在您的程序中,将表单设置为并重AutoScaleMode
试None
。
以下是帮助处理自动缩放表单的资源:
Windows 窗体中的自动缩放
没有解决像素问题的直接解决方案。但我们可以自己做。首先,我们必须找到表单中可用的控件,然后我们必须调整它们的大小。
添加一个类“IdentifyControls.cs”,它标识表单的所有控件并返回应用程序中的控件列表。可以将一个类添加到应用程序中,从菜单栏中选择项目 -> 添加类。然后输入
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FallingFlowers // Falling Flowers is the name of my project
{
public static class IdentifyControl
{
public static List<Control> findControls(Control c)
{
List<Control> list = new List<Control>();
foreach (Control control in c.Controls)
list.Add(control);
return list;
}
}
}
然后将另一个类添加到您的应用程序中,例如“demo.cs”:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
namespace FallingFlowers // Falling Flowers is the name of my project
{
public class demo
{
public static void relocate(Form fo, int ox, int oy)
{
List<Control> list = new List<Control>();
list = IdentifyControl.findControls(fo);
for (int i = 0; i < list.Count; i++)
reposition(list[i], ox, oy);
}
public static void reposition(Control c, int ox, int oy)
{
int x, y;
x = ((c.Location.X * Screen.PrimaryScreen.Bounds.Width) / ox);
y = ((c.Location.Y * Screen.PrimaryScreen.Bounds.Height) / oy);
c.Location = new Point(x, y);
x = ((c.Width * Screen.PrimaryScreen.Bounds.Width) / ox);
y = ((c.Height * Screen.PrimaryScreen.Bounds.Height) / oy);
c.Width = x;
c.Height = y;
if (c is Label || c is Button)
resizeText(c, ox, oy);
}
public static void resizeText(Control l, int ox, int oy)
{
float s;
float txtsize = l.Font.Size;
s = ((txtsize * Screen.PrimaryScreen.Bounds.Width) / ox)+1;
l.Font = new Font(l.Font.Name, s,l.Font.Style);
}
public static void repositionForm(Form f, int ox, int oy)
{
int x, y;
x = (f.Location.X * Screen.PrimaryScreen.Bounds.Width) / ox;
y = (f.Location.Y * Screen.PrimaryScreen.Bounds.Width) / oy;
f.Location = new Point(x, y);
}
}
}
此类包含重新定位控件、调整文本大小和调整表单大小的方法。
在表单的加载事件中调用这些函数。
重新定位表单中的所有控件
demo.relocate(this, 1366, 768);
这里 1366 和 768 是开发应用程序的原始分辨率。
要重新定位表单:
demo.repositionForm(this, 1366, 768);
1366 和 768 是开发应用程序的原始分辨率。
对你来说,它将是demo.relocate(this, 1920, 1080);
。
我希望这会对你有所帮助:-)...
我同意屏幕设置的代码将有助于找出您的问题。
但似乎您正在设置图片以设置坐标点而不是相对于屏幕尺寸的点。您可能希望使坐标与屏幕大小成比例,以使显示始终看起来不错。