Вопрос, поднятый в данном запросе, связан с неправильным поведением кнопок минимизации, восстановления и закрытия окон в приложениях Delphi. Проблема проявляется в том, что при наведении курсора мыши на эти кнопки, их визуальное состояние не изменяется, в отличие от стандартного поведения, которое демонстрируют другие приложения.
Пример неправильного поведения:
Пример правильного поведения:
Проблема проявляется на разных версиях Delphi, начиная с XE6, и даже в более старых версиях, таких как Delphi 7, 5 и 4.
Важным моментом является то, что проблема связана с высоким разрешением экрана (High DPI).
Для решения проблемы необходимо сделать приложение совместимым с High DPI. Существуют несколько способов сделать это:
В свойствах запуска приложения в режиме совместимости отметить "Отключить масштабирование экрана для высокого DPI" ("Disable display scaling on high DPI settings").
Вызвать функцию SetProcessDPIAware в начале выполнения программы, в файле .dpr. Однако, этот метод может привести к гонке условий, поэтому предпочтительнее использовать манифест.
Использовать пользовательский манифест с настройками true или true/PM (по умолчанию манифест Delphi, включающий "Enable runtime themes", не поддерживает High DPI).
Текущие версии 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.