Skip to content

Настройки: пересобирать окно при смене DPI и разрешения (XIC-15) - #9

Merged
Oksion merged 1 commit into
mainfrom
oksion/xic-15-settings-dpi-rescale
Jul 29, 2026
Merged

Настройки: пересобирать окно при смене DPI и разрешения (XIC-15)#9
Oksion merged 1 commit into
mainfrom
oksion/xic-15-settings-dpi-rescale

Conversation

@Oksion

@Oksion Oksion commented Jul 29, 2026

Copy link
Copy Markdown
Owner

Закрывает XIC-15.

Что и почему

Шрифты и Sc() у нас пиксельные и снимаются в момент постройки окна. Само окно настроек при этом не реагировало ни на WM_DPICHANGED, ни на смену разрешения — после смены масштаба текст оставался в старом кегле и расходился с разметкой.

Заметнее всего страдал пояснительный текст под названиями опций: его высота считается один раз при постройке (SettingsToolkit.AddRowMeasureText(desc, DescFont)h = Sc(29) + descH + Sc(14)), поэтому при рассинхроне описание обрезается или висит с зазором. Типовой сценарий — удалённое подключение, которое подгоняет разрешение под клиента.

Флайауты это давно умеют: FlyoutForm.OnDpiChanged → OnDpiRescaled (панель и «Монитор», XIC-8). Окно настроек — обычный Form, и мимо этой механики прошло.

Изменения

Что Как
SettingsForm.OnDpiChanged Rescale(): полная пересборка + подгон размера/позиции под новый Sc()
SystemEvents.DisplaySettingsChanged подписка: разрешение меняется и без смены DPI, тогда WM_DPICHANGED не приходит вовсе. Событие идёт из системного потока пачкой → маршалим в UI + дебаунс 250 мс; спрятанное окно не трогаем, его пересоберёт следующий Popup
ambient-шрифт формы был единственным заданным в пунктах мимо ScaledFonts (new Font("Segoe UI", 9f)); контролы без явного Font наследовали его и разъезжались с остальными → переведён на ScaledFonts, а меткам в AddInfoRow и AboutTab проставлен Font явно
AutoScaleMode.None задан явно — масштабируем сами, иначе WinForms домасштабирует поверх наших размеров (особенно теперь, когда ambient-шрифт меняется вместе с DPI)

Пересборка переиспользует уже обкатанный путь BuildAll() — тот же, которым живёт смена темы: свежий SettingsToolkit, сброс кэша вкладок, ленивое построение активной.

Проверка

  • dotnet build XiControl.sln -c Release0 ошибок / 0 предупреждений
  • dotnet test169 зелёных
  • ⚠️ Не проверено вживую на исходном сценарии (удалённое подключение с другим DPI) — у меня нет этой связки. Стоит проверить руками: открыть настройки и поменять масштаб/разрешение, убедиться, что пояснения не обрезаются и окно остаётся по центру. Отдельно интересно, что именно прилетает в NoMachine-сценарии — WM_DPICHANGED, DisplaySettingsChanged или оба; фикс покрывает оба пути.

Замечание к слиянию

Правит CHANGELOG.md в том же разделе [Unreleased], что и PR #8 — при слиянии второго может потребоваться тривиальное разрешение конфликта (обе ветки добавляют секцию «Исправлено»).

🤖 Generated with Claude Code

Шрифты и Sc() у нас пиксельные и снимаются в момент постройки, а окно настроек
не реагировало ни на WM_DPICHANGED, ни на смену разрешения. После смены масштаба
текст оставался в старом кегле и расходился с разметкой — заметнее всего обрезался
пояснительный текст: высота карточки под него считается один раз по DescFont.

- SettingsForm.OnDpiChanged -> Rescale() (полная пересборка + подгон размера),
  тем же способом, каким уже живёт смена темы; для флайаутов это делает FlyoutForm
- подписка на SystemEvents.DisplaySettingsChanged: разрешение меняется и без смены
  DPI (удалённый рабочий стол подгоняет его под клиента), тогда WM_DPICHANGED не
  приходит. Событие сыплется пачкой из системного потока -> маршалим в UI + дебаунс
  250 мс; спрятанное окно не трогаем, его пересоберёт следующий Popup
- ambient-шрифт формы был единственным в пунктах мимо ScaledFonts; контролы без
  явного Font наследовали его и разъезжались с остальными -> перевели на ScaledFonts,
  а меткам в AddInfoRow/AboutTab проставили Font явно
- AutoScaleMode.None задан явно: масштабируем сами, иначе WinForms домасштабирует
  поверх наших размеров

Сборка 0/0, тесты 169 зелёных.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Oksion
Oksion force-pushed the oksion/xic-15-settings-dpi-rescale branch from b09d782 to 8659bfe Compare July 29, 2026 08:54
@Oksion
Oksion merged commit feba9cb into main Jul 29, 2026
5 checks passed
@Oksion
Oksion deleted the oksion/xic-15-settings-dpi-rescale branch July 29, 2026 08:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant