Пользовательские проблемы с отображением TabControl

Я уже несколько дней пишу пользовательский элемент управления для рисования вкладок, и по большей части все красиво и прекрасно работает... за исключением случаев, когда я использую его на своем компьютере с 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);

Я переустановил VS на моей машине разработки (Win10). Я затрудняюсь объяснить, почему и как решить эту проблему.

Любая / вся помощь будет очень цениться.

1 ответ

Решение

Глядя на ширину вкладки в ваших сравнительных изображениях, я считаю, что это еще одна проблема, вызванная автоматическим масштабированием управления Windows. Я обнаружил, что параметр dpiAware автоматически устанавливается при запуске из Visual Studio, а затем возвращается к стандартному масштабированию Windows, которое Windows реализует вне Visual Studio.

Чтобы вообще предотвратить автоматическое масштабирование при запуске вне Visual Studio, необходимо уведомить ОС, что ваше приложение является dpiAware, вызвав метод Win32 P/Invoke SetProcessDPIAware() из вашего Main() до вызова Application.Run(). Как показано в примере ниже. Это позволит вашим элементам управления использовать исходное разрешение, из которого вы проектируете координаты.

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 на основе ширины элемента управления вкладками вместо определенного местоположения. (Или с использованием некоторой комбинации контрольных измерений вместо точного размещения иглы.)

Другие вопросы по тегам