WinForms Различные DPI-макеты - PullRequest
       22

WinForms Различные DPI-макеты

4 голосов
/ 05 декабря 2009

Каким-то образом формы и элементы управления, созданные с помощью Visual Studio и дизайнера, могут масштабироваться в зависимости от текущего размера DPI / шрифта Windows. Одна часть моего пользовательского интерфейса - это элемент управления вкладками, полный динамических страниц и меток / входов, сгенерированных в зависимости от выбора пользователя. Когда они создаются, они используют жестко закодированные размеры, которые выглядят правильно для 96 DPI.

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

Ответы [ 3 ]

9 голосов
/ 05 декабря 2009

Что ж, это технически легко сделать, выполнив итерацию коллекции Control на вкладках и умножив свойства Point и Size на коэффициент масштабирования. Но это становится ужасно сложно, когда вы начинаете учитывать свойства Dock и Anchor.

Безусловно, самый простой подход - позволить машине масштабирования классов Form сделать всю работу за вас. Вам нужно будет добавить элементы управления на вкладки до того, как запустится событие Load. Сделайте это в конструкторе.

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

protected override void OnLoad(EventArgs e) {
    this.Font = new Font(this.Font.FontFamily, this.Font.Size * 120 / 96);
    base.OnLoad(e);
}
0 голосов
/ 27 октября 2011

Я решил ту же проблему с элементами управления, созданными во время выполнения по мере необходимости, выполнив то, что делает designer.cs:

void CreateRuntimePanel()
{
    //instantiate controls here...

    //suspend layouts
    //begin inits

    this.SuspendLayout();

    //set control properties here

    //before adding any control to form's Controls collection, do this
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

    //add controls to form's Controls collection here

    //resume layouts
    //end inits

    this.ResumeLayout(false);  
}
0 голосов
/ 05 декабря 2009

Вы пробовали свойство AutoScaleMode ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...