自定义TabControl显示问题

3
我已经花了几天时间编写一个自定义绘制的选项卡控件,大部分情况下一切都很好,它表现得非常出色...但当我在我的Windows 10电脑上使用它时(在运行时),就会出现问题。 我已经回到最基本的几行代码来跟踪错误,但我无论如何也想不出原因。
以下是唯一使用的代码,在简短地设计一个水平对齐的选项卡控件。
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1.UI
{
    class TabControlTest : TabControl
    {
        public TabControlTest()
        {
            Alignment = TabAlignment.Left;
            SizeMode = TabSizeMode.Fixed;
        }
    }
}

设计时窗体

我只是将自定义选项卡控件添加到了窗体上,添加了几个分组框作为参考,并将窗体的背景颜色更改为灰色,以便您可以清楚地看到选项卡控件。

现在,在设计时,2个分组框(1个在选项卡控件中,1个在窗体上)完美对齐。

但是在运行时,我看到了非常不同的结果。

我的Windows 10计算机上的运行时窗体

如您所见,控件的选项卡部分现在比设计时更大,导致选项卡的内容也移动了。

如果我在Windows 7计算机上执行此操作,则所有内容都显示为应该出现在设计时的样子!

我已经添加了ImageSize,但没有任何区别。

ItemSize = new System.Drawing.Size(30, 150);

我已经在我的(Windows 10)开发机上重新安装了VS。我不知道如何解释这个问题并解决它。

非常感谢任何/所有帮助。


缩放基于字体属性。在每个控件的属性窗口中右键单击“字体”,然后单击“重置”。 - Hans Passant
1个回答

2
观察您比较图片中的选项卡宽度,我认为这是由于自动 Windows 控制缩放引起的另一个问题。我发现当从 Visual Studio 中运行时,dpiAware 选项会自动设置,然后在 Visual Studio 外部恢复到 Windows 实现的默认缩放。
为了完全避免在 Visual Studio 外部运行时的自动缩放,您需要在调用 Application.Run() 之前从 Main() 调用 Win32 P/Invoke SetProcessDPIAware() 方法来通知操作系统您的应用程序是dpiAware,就像下面的示例所演示的那样。这将让您的控件使用您设计坐标的本地分辨率。
static class Program
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();

    static void Main(string[] args)
    {
        if (Environment.OSVersion.Version.Major >= 6)
            SetProcessDPIAware();

        Application.Run(new UIMonitor());
    }
}

如果您想保持缩放比例,可以根据选项卡控件的宽度设置GroupBox的位置,而不是固定位置。(或使用一些控件测量的组合,而不是精确像素的放置。)


这只是掩盖问题,而不是解决问题。当他在另一台以96 dpi运行的机器上运行程序时,他将会遇到完全相同的问题。 - Hans Passant
我这样可以在所有机器上得到更一致的坐标。但是,你提到的字体缩放可能也可以实现,正如我回答中的最后一句所说的那样。 - Moon
1
谢谢Don,这正是我问题的答案。添加这个小代码片段解决了我的问题。谢谢! - Mike Stephens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接