自定义 TabControl 显示问题

Custom TabControl display issues

几天来我一直在编写一个自定义绘制的选项卡控件,大部分情况下一切都很漂亮,而且它做得很棒......除了我在 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 7 计算机上执行此操作,所有内容都将按照设计时的样子显示,这是应该的!

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

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

我已经在我的 (Win10) 开发机器上重新安装了 VS。我无法解释为什么以及如何解决这个问题。

Any/all 将不胜感激。

查看比较图像中的制表符宽度,我相信这是自动 Windows 控件缩放引起的另一个问题。我发现 dpiAware 选项在 Visual Studio 中的 运行 时自动设置,然后恢复为 windows 实现的默认 Windows 缩放Visual Studio 之外。

为了防止 auto-scaling 当 运行 在 Visual Studio 之外时,您需要通知 OS 您正在申请 dpiAware 通过调用在调用 Application.Run() 之前从 Main() 中调用 Win32 P/Invoke SetProcessDPIAware() 方法,如下例所示。这将使您的控件使用您设计坐标的原始分辨率。

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 位置。 (或者通过使用控制测量的某种组合而不是精确的像素放置。