Когда в класс форм добавлена поддержка переключения DPI во время выполнения, не было рассмотрено основные элементы пользовательского интерфейса, такие как меню.
Рисунок меню принципиально нарушен, потому что он зависит от Screen.MenuFont, который является системной метрикой, не характерной для мониторов. Таким образом, хотя сама форма может быть правильно масштабирована относительно просто, меню, отображаемое над ней, работает только правильно, если масштабирование происходит в соответствии с тем, какие показатели были загружены в объект Screen.
Это проблема для главного меню, его всплывающих меню и всех всплывающих меню в форме. Ни один из этих масштабов, если форма перемещена на монитор с другим DPI, чем системные показатели.
Единственный способ действительно сделать эту работу - исправить VCL. Ожидание Embarcadero для извлечения мульти-DPI на самом деле не является вариантом.
Глядя на код VCL, основная проблема заключается в том, что свойство Screen.MenuFont назначается на холст меню, а не на выбор шрифта, подходящего для монитора, на котором будет отображаться меню. Затронутые классы можно найти просто путем поиска Screen.MenuFont в источнике VCL.
Каков правильный способ обойти это ограничение без необходимости полностью переписывать связанные классы?
Мой первый наклон - использовать обход, чтобы отслеживать всплывающие окна меню и переопределять свойство Screen.MenuFont, когда оно используется для настройки меню. Это похоже на слишком большой взлом.