Вопрос, поднятый пользователем Thalm, касается разработки приложения на Delphi, которое может иметь несколько окон DirectX, расположенных на разных мониторах. Существующий способ выбора разрешения экрана в полноэкранном режиме через выпадающий список с поддержкойми разрешениями неудобен, так как пользователю приходится самостоятельно выбирать разрешение экрана. В идеале, было бы полезно иметь возможность выбора разрешения "текущего" экрана, то есть разрешения экрана, на котором находится окно.
Для решения этой проблемы можно использовать различные подходы, включая DirectX, WinAPI и встроенные методы Delphi. В контексте предоставленной информации пользователь Thalm нашел решение, которое работает напрямую через WinAPI. Ниже представлен код функции GetRectOfMonitorContainingRect, которая возвращает прямоугольник монитора, содержащего или наиболее близкого к указанному:
function GetRectOfMonitorContainingRect(const R: TRect): TRect;
{ Returns bounding rectangle of monitor containing or nearest to R }
type
HMONITOR = type THandle;
TMonitorInfo = record
cbSize: DWORD;
rcMonitor: TRect;
rcWork: TRect;
dwFlags: DWORD;
end;
const
MONITOR_DEFAULTTONEAREST = $00000002;
var
Module: HMODULE;
MonitorFromRect: function(const lprc: TRect; dwFlags: DWORD): HMONITOR; stdcall;
GetMonitorInfo: function(hMonitor: HMONITOR; var lpmi: TMonitorInfo): BOOL; stdcall;
M: HMONITOR;
Info: TMonitorInfo;
begin
Module := GetModuleHandle('user32');
MonitorFromRect := GetProcAddress(Module, 'MonitorFromRect');
GetMonitorInfo := GetProcAddress(Module, 'GetMonitorInfoA');
if Assigned(MonitorFromRect) and Assigned(GetMonitorInfo) then begin
M := MonitorFromRect(R, MONITOR_DEFAULTTONEAREST);
Info.cbSize := SizeOf(Info);
if GetMonitorInfo(M, Info) then begin
Result := Info.rcMonitor;
Exit;
end;
end;
Result := GetRectOfPrimaryMonitor(True);
end;
Также в комментариях обсуждаются альтернативные подходы, включая использование GetDeviceCaps, свойства TCustomForm.Monitor для получения монитора, на котором находится форма, и использование Screen.Monitors для получения всех мониторов.
Для получения текущего разрешения экрана, на котором находится окно, можно использовать следующий код:
var
MonInfo: TMonitorInfo;
begin
MonInfo.cbSize := SizeOf(MonInfo);
GetMonitorInfo(MonitorFromWindow(Handle, MONITOR_DEFAULTTONEAREST), @MonInfo);
ShowMessage(Format('Current resolution: %dx%d',
[MonInfo.rcMonitor.Right - MonInfo.rcMonitor.Left,
MonInfo.rcMonitor.Bottom - MonInfo.rcMonitor.Top]));
Этот код позволяет определить разрешение экрана, на котором находится текущее окно приложения, без необходимости вручную выбирать разрешение из списка.
Заключение
В данной статье мы рассмотрели, как получить разрешение экрана для всех мониторов в приложении Delphi, используя DirectX и WinAPI. Мы обсудили различные методы, включая использование функций MonitorFromRect, GetMonitorInfo, EnumDisplayDevices и EnumDisplaySettings, а также свойства VCL. Представленные примеры кода на Object Pascal (Delphi) позволяют разработчикам интегрировать эти функции в свои проекты для автоматического определения разрешения экрана.
Пользователь ищет решение для автоматизации выбора разрешения экрана в приложении Delphi, используя окна DirectX на разных мониторах, и обсуждается использование функций WinAPI для достижения этой цели.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS