Проблема с размером Windows Form при разных разрешениях

Я новичок в разработке оконных форм, после разработки некоторых форм я заметил, что формы не отображаются правильно в разных разрешениях, форма выходит за пределы экрана в некоторых разрешениях

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

Пожалуйста, уточните свой ответ, так как я новичок в разработке форм Windows.

Спасибо


person Asad Malik    schedule 18.03.2014    source источник
comment
I am newbie in window forms development - winforms не рекомендуется для новых проектов, только для поддержки устаревших приложений. Если у вас нет необходимости поддерживать какие-либо унаследованные приложения, нет никакой необходимости начинать изучение winforms в 2014 году.   -  person Federico Berasategui    schedule 18.03.2014
comment
Я настоятельно рекомендую WPF вместо winforms. По умолчанию он не зависит от разрешения, имеет более широкие возможности, более простые функции настройки, стили, шаблоны, серьезную привязку данных и обеспечивает большее разделение между пользовательским интерфейсом и бизнес-логикой.   -  person Federico Berasategui    schedule 18.03.2014


Ответы (2)


Проблема здесь, скорее всего, в том, что он не работает так, как вы ожидаете. При разработке WinForms, когда вы создаете форму, вы фактически устанавливаете ее размер. Это следует за функцией размера шрифта по умолчанию на машине, на которой отображается форма, и не коррелирует напрямую с разрешением на рассматриваемом дисплее. Таким образом, если вы создаете большую форму с множеством элементов управления или большими элементами управления, она может хорошо отображаться при высоком разрешении, но не при низком. Чтобы лучше понять этот размер, взгляните на свой файл Form1.Designer.cs, и вы увидите, что значения размера устанавливаются для элементов управления. Эти размеры не соответствуют пикселям, но они должны дать вам относительный размер. Вам, вероятно, также следует изучить блоки диалога на MSDN или в другом месте.

Вы можете написать код для реакции на это разрешение в событии загрузки формы, но в конечном итоге размер будет частично ограничен количеством виджетов, которые вам нужно отобразить. Если у вас есть многострочное поле редактирования, элемент управления сеткой, элемент управления в виде дерева или какой-либо другой большой виджет, вы можете автоматически изменять его размер в зависимости от текущего разрешения экрана и одновременно изменять размер окна. Но это решение зависит от конкретного приложения и зависит от ваших потребностей, поэтому окна не пытаются автоматически изменять размер за вас.

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

person cdkMoose    schedule 19.03.2014
comment
Что ж, этот ответ развеивает мои сомнения, спасибо за такой ясный и точный ответ. - person Asad Malik; 19.03.2014

Вы можете зацикливаться на каждом элементе управления в форме в событии загрузки и повторно масштабировать их и саму форму, масштаб - это соотношение между размерами экрана, для которого вы разработали форму, к размерам экрана, на котором приложение работает.

    //this is a utility static class
    public static class Utility{


    public static void fitFormToScreen(Form form, int h, int w)
    {

        //scale the form to the current screen resolution
        form.Height = (int)((float)form.Height * ((float)Screen.PrimaryScreen.Bounds.Size.Height / (float)h));
        form.Width = (int)((float)form.Width * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));

        //here font is scaled like width
            form.Font = new Font(form.Font.FontFamily, form.Font.Size * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));

        foreach (Control item in form.Controls)
        {
            fitControlsToScreen(item, h, w);
        }

    }

    static void fitControlsToScreen(Control cntrl, int h, int w)
    {
        if (Screen.PrimaryScreen.Bounds.Size.Height != h)
        {

            cntrl.Height = (int)((float)cntrl.Height * ((float)Screen.PrimaryScreen.Bounds.Size.Height / (float)h));
            cntrl.Top = (int)((float)cntrl.Top * ((float)Screen.PrimaryScreen.Bounds.Size.Height / (float)h));

        }
        if (Screen.PrimaryScreen.Bounds.Size.Width != w)
        {

            cntrl.Width = (int)((float)cntrl.Width * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));
            cntrl.Left = (int)((float)cntrl.Left * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));

                cntrl.Font = new Font(cntrl.Font.FontFamily, cntrl.Font.Size * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));

        }

        foreach (Control item in cntrl.Controls)
        {
            fitControlsToScreen(item, h, w);
        }
    }
    }


        //inside form load event
        //send the width and height of the screen you designed the form for
        Utility.fitFormToScreen(this, 788, 1280);
        this.CenterToScreen();
person Mohamed Ali    schedule 15.11.2015
comment
Огромное спасибо! :) - person moksef; 02.06.2021