GetWindowPlacement / SetWindowPlacement не работает в WinForms для высокого DPI - PullRequest
1 голос
/ 09 апреля 2010

У меня есть старое приложение WinForms, и я хочу сохранить положение и размер окна между сеансами. Я использовал GetWindowPlacement и SetWindowPlacement во время событий FormClosing и Load. Проблема, которую я получаю, заключается в том, что при более высоких настройках DPI (например, Medium, размер при 125%) размеры продолжают увеличиваться. Я вызову SetWindowPlacement для этого с определенным размером, но когда вызывается GetWindowPlacement, эти числа возвращаются на 25% больше, даже если окно было одинакового размера все время. Такая же проблема существует при сохранении размера изменяемого размера элемента в форме.

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

Я звонил IsProcessDPIAware в обоих проектах, и оба true. Кто-нибудь знает, что может быть причиной этого?

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

Я нашел этот параметр в файле .resx формы:

<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing">
  <value>5, 13</value>
</data>

Когда это присутствовало, VS автоматически изменял AutoScaleBaseSize, чтобы он работал для вашего DPI, но не для других. Для всех остальных форма будет постоянно расти или уменьшаться.

При выборе AutoScaleMode = Шрифт на панели свойств дизайнера VS включил и «модернизировал» настройки масштабирования шрифта. Теперь это работает для всех точек на дюйм.

1 голос
/ 09 апреля 2010

Похоже, вы как-то запускаете масштабирование, как выбрано свойством AutoScaleMode формы. Разница между вашими двумя проектами будет в свойстве AutoScaleDimensions, видимом в файле Designer.cs.

Не уверен, почему это может вызвать проблемы, но класс Form уже использует методы GetWindowPlacement () для внутренних нужд, RecreateHandleCore () и UpdateWindowState (). Чтобы получить реальную помощь, я предполагаю, что вам нужно будет где-нибудь опубликовать репроект.

...