自定义 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 位置。 (或者通过使用控制测量的某种组合而不是精确的像素放置。)
几天来我一直在编写一个自定义绘制的选项卡控件,大部分情况下一切都很漂亮,而且它做得很棒......除了我在 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 位置。 (或者通过使用控制测量的某种组合而不是精确的像素放置。)