Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Адаптация приложений C++ Builder к изменению DPI в Windows 10: использование WinAPI для корректной работы с текстом

Delphi , Синтаксис , Справочник по API-функциям

С приходом Windows 10 и её возможностью динамически изменять DPI (размер текста) без необходимости перезагрузки системы, разработчики столкнулись с новой проблемой: их приложения, созданные в C++ Builder, не были готовы к такому изменению в режиме реального времени. В данной статье мы рассмотрим, как система информирует приложение о смене DPI, какие сообщения следует обрабатывать, и как применить решение, основанное на чистом WinAPI.

Обзор проблемы

С Windows 10 система больше не требует перезагрузки или выхода из системы для изменения размера текста (DPI). Приложения, созданные в C++ Builder, могут не поддерживать такие изменения в реальном времени. Важно понимать, как система уведомляет приложение о смене DPI и какие сообщения необходимо обрабатывать для корректной работы приложения.

Решение проблемы

Система использует сообщение WM_DPICHANGED, которое доступно начиная с Windows 8.1. Это сообщение отправляется окну, когда окно перемещается на другой монитор с другим разрешением DPI. В Windows 10 изменение DPI в реальном времени с точки зрения API идентично перемещению окна на монитор с другим разрешением DPI.

Для того чтобы приложение могло получать это сообщение, включая динамические изменения DPI в Windows 10, необходимо заявить о поддержке DPI для каждого монитора. Предпочтительный способ - указать поддержку в манифесте приложения, установив атрибут dpiAwareness в значение PerMonitorV2 (и дополнительное значение PerMonitor) и dpiAware в True/PM для обратной совместимости с более старыми сборками Windows 10 и Windows 8.1.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    ...
    <asmv3:application>
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>True/PM</dpiAware>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>
        </asmv3:windowsSettings>
    </asmv3:application>
</assembly>

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

Альтернативный путь

С C++ Builder 10.3 вы можете использовать события форм:

  • OnAfterMonitorDpiChanged
  • OnBeforeMonitorDpiChanged

Не забудьте также установить DPI Awareness в значение PerMonitorV2 в манифесте приложения в настройках проекта.

Пример кода на Object Pascal (Delphi)

procedure TForm1.WMDpiChanged(var Msg: TMsg); message WM_DPICHANGED;
begin
  // Обработка сообщения для корректного масштабирования элементов формы
  inherited;
  // Ваш код для масштабирования элементов интерфейса
end;

Заключение

Адаптация приложений C++ Builder к изменению DPI в Windows 10 требует внимательного подхода и понимания того, как система уведомляет приложение о смене DPI. Использование чистого WinAPI, как описано выше, позволит обеспечить корректную работу приложения с текстом и другими элементами интерфейса при динамическом изменении DPI.

Создано по материалам из источника по ссылке.

Статья о проблеме адаптации приложений, созданных в C++ Builder, к динамическому изменению DPI в Windows 10 и использовании WinAPI для корректной работы с текстом.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:17:25/0.0043818950653076/1