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

Получение разрешения экрана для всех мониторов в приложении Delphi: руководство по DirectX и WinAPI

Delphi , ОС и Железо , Монитор и Экран

Вопрос, поднятый пользователем 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




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


:: Главная :: Монитор и Экран ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 23:35:22/0.003838062286377/0