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

Решение проблемы с состоянием кнопок окна в Delphi под разными режимами Windows и High DPI

Delphi , ОС и Железо , Windows

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

Пример неправильного поведения:

Неправильное поведение

Пример правильного поведения:

Правильное поведение

Проблема проявляется на разных версиях Delphi, начиная с XE6, и даже в более старых версиях, таких как Delphi 7, 5 и 4.

Важным моментом является то, что проблема связана с высоким разрешением экрана (High DPI).

Для решения проблемы необходимо сделать приложение совместимым с High DPI. Существуют несколько способов сделать это:

  1. В свойствах запуска приложения в режиме совместимости отметить "Отключить масштабирование экрана для высокого DPI" ("Disable display scaling on high DPI settings").

  2. Вызвать функцию SetProcessDPIAware в начале выполнения программы, в файле .dpr. Однако, этот метод может привести к гонке условий, поэтому предпочтительнее использовать манифест.

  3. Использовать пользовательский манифест с настройками true или true/PM (по умолчанию манифест Delphi, включающий "Enable runtime themes", не поддерживает High DPI).

Пример манифеста для true:

<asmv3:application>
  <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    <dpiAware>true</dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

Пример манифеста для true/PM:

<asmv3:application>
  <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
    <dpiAware>true/PM</dpiAware>
  </asmv3:windowsSettings>
</asmv3:application>

Текущие версии Delphi VCL и FMX не поддерживают настройку на разное разрешение для каждого монитора (Per-Monitor DPI), поэтому использование манифеста true/PM следует рассматривать только в том случае, если вы самостоятельно обрабатываете настройку на разное разрешение для каждого монитора.

Важно отметить, что VCL является источником проблемы, и проблема связана с классом TForm или его предками.

Пример кода, который создает главное окно без использования VCL и работает корректно:

program Win;
{$R *.res}

uses
  Windows,
  Messages,
  SysUtils;

var
  Msg: TMSG;
  LWndClass: TWndClass;
  hMainHandle: HWND;
...

function WindowProc(HWND, Msg: Longint; wParam, lParam: Longint): Longint; stdcall;
...

begin
  RegisterClass(LWndClass);
  hMainHandle := CreateWindow(LWndClass.lpszClassName, 'Window Title', WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE, 0, 0, 360, 200, 0, 0, hInstance, nil);
  ...
end.

Рекомендуется также ознакомиться с руководством по обновлению Delphi VCL приложений для поддержки 4K экранов, доступным на сайте Alexander Halser.

Для полноценного решения проблемы необходимо учитывать, что приложение должно быть совместимо с High DPI, и это может потребовать дополнительной работы, особенно если в приложении используются приватные синглтоны из VCL, которые не поддерживают Per-Monitor DPI.

Проблема была задокументирована в качестве бага в системе отслеживания ошибок Embarcadero, с номером RSP-19358.

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

Проблема заключается в неправильном отображении состояния кнопок окна в приложениях Delphi на разных режимах Windows и при использовании высокого разрешения экрана (High DPI).


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

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




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


:: Главная :: Windows ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 15:17:18/0.0053060054779053/1