5

编码我的项目进展顺利。但是今天我发现了一个问题。

我的主笔记本有全高清 (1920x1080) 分辨率,我正在这里编写我的项目。当我将主笔记本的分辨率更改为 1280x1024、1280x800 或 1024x768 时,没有问题。我的应用程序的分辨率是 1024x768,它没有崩溃。这是打印屏幕。

普通画面

但我的另一台笔记本的分辨率为 1366x768。我正在这个笔记本上运行我的应用程序。哦!有一种失望。我的应用程序屏幕移动了。这是坏的打印屏幕。

坏屏幕

我不懂为什么。我能做些什么来纠正这个错误?

4

5 回答 5

8

它来自不同的 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;
于 2012-11-03T18:37:35.113 回答
3

我在使用 Windows 窗体表单时遇到了同样的问题。我所要做的就是将表单的 AutoScaleMode 设置从 Font 更改为 DPI,并将 FormBorderStylefor 设置从 Fixed 更改为 Sizable。现在 Windows 窗体窗体可以在桌面和笔记本电脑上正确显示。

于 2014-05-14T20:34:44.437 回答
2

您可以检查两个屏幕的 DPI 设置是否相同。您可以通过控制面板或显示选项来执行此操作(我记不清了,而且我面前没有 Windows 7)(您的高清笔记本电脑上可能有 120 DPI,而另一台笔记本电脑上可能有标准 96 )。

在您的程序中,将表单设置为并重AutoScaleModeNone

以下是帮助处理自动缩放表单的资源:
Windows 窗体中的自动缩放

于 2012-11-01T21:19:28.020 回答
1

没有解决像素问题的直接解决方案。但我们可以自己做。首先,我们必须找到表单中可用的控件,然后我们必须调整它们的大小。

添加一个类“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);

我希望这会对你有所帮助:-)...

于 2014-04-06T10:01:30.357 回答
0

我同意屏幕设置的代码将有助于找出您的问题。

但似乎您正在设置图片以设置坐标点而不是相对于屏幕尺寸的点。您可能希望使坐标与屏幕大小成比例,以使显示始终看起来不错。

于 2012-11-01T21:18:19.903 回答