Как я могу сделать свое приложение WinForms DPI-Aware

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

Могу ли я сделать формы в этом приложении DPI-Aware с наименьшим количеством рефакторинга, поскольку у нас нет времени.


person Sam    schedule 14.03.2011    source источник
comment
Переехать на WPF можно, но не быстро.   -  person zerkms    schedule 14.03.2011
comment
возможный дубликат разные макеты WinForms DPI   -  person ChrisF    schedule 14.03.2011
comment
скорее всего :) спасибо...   -  person Sam    schedule 16.03.2011


Ответы (2)


Важно, чтобы вы не указывали координаты и размеры в пикселях. Это исключает использование Control.Top и Control.Left, что делает дизайнер, когда вы «просто размещаете» элементы управления в форме.

Чтобы получить пользовательский интерфейс, который работает с различными настройками DPI, почти все должно иметь динамический размер. Для элементов управления должен быть включен Control.AutoSize. Но просто включение AutoSize полностью испортит ваш макет, поскольку позиция управления все равно будет статической.

Чтобы получить динамическое расположение элементов управления, вы можете использовать элементы управления контейнера, такие как FlowLayoutPanel и TableLayoutPanel (с размерами AutoSize). Обычные элементы управления внутри них будут просто перемещаться по форме в соответствии с автоматически определенными размерами.

Как вы можете видеть, это не просто, требует некоторого опыта, чтобы сделать это правильно, и требует огромного количества тестов (виртуальные машины с различными настройками DPI прекрасно работают). Но я думаю, что это обязательно нужно сделать, так как меня всегда раздражает, если на моем ноутбуке что-то выглядит глупо и глючно.

person xod    schedule 14.03.2011
comment
FlowLayoutPanel с обычными панелями. Ключ не в том, чтобы указать размеры, а в свойствах привязки, стыковки и роста. - person Ritch Melton; 14.03.2011

Самый быстрый способ — переопределить OnPaint и использовать свойства Graphics.DpiX и DpiY. См. http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx рекомендуется использовать только файл манифеста вместо SetDpiAware

person user213702    schedule 14.03.2011