GetWindowPlacement/SetWindowPlacement не работает в WinForms для высокого DPI
У меня есть старое приложение WinForms, и я хочу сохранить положение и размер окна между сеансами. Я использовал GetWindowPlacement и SetWindowPlacement во время событий FormClosing и Load. Проблема, которую я получаю, заключается в том, что при более высоких настройках DPI (например, Medium, размер при 125%) размеры продолжают увеличиваться. Я вызову SetWindowPlacement для него с определенным размером, но когда вызывается GetWindowPlacement, эти числа возвращаются на 25% больше, даже если окно было одинакового размера все время. Такая же проблема существует при сохранении размера изменяемого размера элемента в форме.
Теперь это работает нормально, если я создаю новый проект WinForms: размер остается стабильным даже при работе с более высоким DPI. Я предполагаю, что в недрах проекта есть какие-то устаревшие настройки или какие-то загадочные настройки форм, которые все портят, но я не могу найти где.
Я вызвал IsProcessDPIAware на обоих проектах, и оба true
, Кто-нибудь знает, что может быть причиной этого?
2 ответа
Я нашел эту настройку в файле.resx формы:
<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing">
<value>5, 13</value>
</data>
Когда это присутствовало, VS автоматически изменял AutoScaleBaseSize для работы с вашим DPI, но не с кем-либо еще. Для всех остальных форма будет постоянно расти или уменьшаться.
При выборе AutoScaleMode = Font на панели свойств дизайнера VS включил и "модернизировал" настройки масштабирования шрифта. Теперь это работает для всех точек на дюйм.
Похоже, что вы как-то запускаете масштабирование, как выбрано свойством AutoScaleMode формы. Разница между вашими двумя проектами будет в свойстве AutoScaleDimensions, видимом в файле Designer.cs.
Не уверен, почему это может вызвать проблемы, но класс Form уже использует методы GetWindowPlacement() для внутренних нужд, RecreateHandleCore() и UpdateWindowState(). Чтобы получить реальную помощь, я предполагаю, что вам нужно будет где-нибудь опубликовать репроект.