2016-01-05 5 views
3

Я писал пользовательский элемент управления вкладками в течение нескольких дней, и по большей части все довольно красиво, и это потрясающая работа ... , за исключением случаев, когда я использую его на своем компьютере под управлением Windows 10 (во время выполнения).Пользовательские проблемы с дисплеем TabControl

Я вернусь к самым элементарным нескольким строкам кода, чтобы проследить за ошибкой, и я не могу, чтобы жизнь меня поняла.

Ниже приводится только тот код, который я использую в двух словах. Я проектирую горизонтальное выравнивание вкладок.

using System.Drawing; 
using System.Windows.Forms; 

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

Design time form

Я просто добавил контроль пользовательских вкладок в форме, добавил пару групповых ящиков для справочных целей и изменили цвет фона формы к серому, чтобы вы ясно можете видеть вкладка.

В настоящее время во время разработки 2 групповые коробки (1 в панели управления, 1 на форме) идеально подходят.

Но во время выполнения я вижу совсем другой результат.

Form at run-time on my Windows 10 computer

Как вы можете видеть вкладку часть управления теперь больше, чем это было во время разработки и результирующее изменение означает, что контексты вкладки также перемещены.

Если я это сделаю на компьютере под управлением Windows 7, все будет отображаться так, как оно отображается во время разработки, как и должно быть!

Я добавил ImageSize, но это не имеет никакого значения.

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

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

Любая помощь была бы чрезвычайно оценена.

+0

Масштабирование основано на свойстве Шрифт. Щелкните правой кнопкой мыши «Шрифт» в окне «Свойства» для каждого элемента управления и выберите «Сброс». –

ответ

2

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

Чтобы предотвратить автоматическое масштабирование при запуске за пределами Visual Studio, вам необходимо уведомить ОС, что вы используете приложение dpiAware, вызвав метод Win32 P/Invoke SetProcessDPIAware() из вашего основного() перед 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 на основе от ширины вкладок вместо конкретного места. (Или с помощью некоторой комбинации контрольных измерений вместо точного размещения picel.)

+0

Это просто скрывает проблему, она не решает проблему.Он получит ту же самую проблему, когда он запускает свою программу на другой машине, работающей с разрешением 96 точек на дюйм. –

+0

Я получаю гораздо более согласованные координаты на всех машинах таким образом. Тем не менее, размер шрифта, который вы указали, может сделать это, а также последнее предложение в моем ответе. – Don

+1

Спасибо, Дон, это был именно ответ на мою проблему. Добавление этого небольшого фрагмента кода позволило решить мою проблему. Спасибо! –

Смежные вопросы