Разрешение экрана

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Разрешение экрана

Сообщение KUKA » 05.04.2012 18:19:03

Как в паскале можно узнать текущее разрешение экрана в Windows? В Delphi есть screen.height\screen.width, но мне надо без совместимости с делфёй
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Разрешение экрана

Сообщение Bupyc » 05.04.2012 18:48:27

Если только для Windows, то есть API функция GetSystemMetrics.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: Разрешение экрана

Сообщение qivi » 06.04.2012 01:34:26

но мне надо без совместимости с делфёй

Всмысле? Без совместимости с Lazarus (LCL) на чистом FPC? Или именно с дельфой?!!! А то у формы лазаруса то же есть вышеназванные свойства...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Разрешение экрана

Сообщение KUKA » 06.04.2012 11:14:14

qivi писал(а):
но мне надо без совместимости с делфёй

Всмысле? Без совместимости с Lazarus (LCL) на чистом FPC? Или именно с дельфой?!!! А то у формы лазаруса то же есть вышеназванные свойства...


GetSystemMetrics уже помогло, всем спасибо
KUKA
новенький
 
Сообщения: 46
Зарегистрирован: 22.02.2012 20:54:19

Re: Разрешение экрана

Сообщение Сквозняк » 14.10.2017 03:01:18

Не так чтобы через чур было надо, но если есть способ без лазаруса и прочих тяжёлых, а также медленных, зависимостей узнать кроссплатформенно (линукс и виндовс) текущее разрешение экрана, то пригодилось бы.
Сквозняк
энтузиаст
 
Сообщения: 548
Зарегистрирован: 29.06.2006 22:08:32

Re: Разрешение экрана

Сообщение Сквозняк » 17.10.2017 20:32:09

Разобрался. Если перед запуском графического движка не узнать разрешение экрана, то надо запустить движок с малюсеньким размером окна, в оконном видеорежиме, а на следующем кадре узнать размер экрана и перезапустить окно с новыми размерами.

Точно также, если при програмном перемещении курсора мыши в каком-то из видеорежимов промахиваетесь, то на следующем кадре можно сделать второй прыжок курсора и поставить его куда надо :mrgreen:
Сквозняк
энтузиаст
 
Сообщения: 548
Зарегистрирован: 29.06.2006 22:08:32

Re: Разрешение экрана

Сообщение mig-31 » 19.10.2017 12:07:11

Как все запущено. Правильнее будет использовать TScreen.

http://lazarus-ccr.sourceforge.net/docs/lcl/forms/tscreen.html
mig-31
постоялец
 
Сообщения: 175
Зарегистрирован: 14.07.2011 13:46:48

Re: Разрешение экрана

Сообщение Сквозняк » 19.10.2017 18:01:21

Это правильное тянет за собой создание полновесного лазарусного приложения, а у меня лёгкий плеер для проигрывания двух форматов файлов, мелкого размера, из которого выкинуто всё лишнее. mplayer конечно хорош, но таскать его с проектом лицензия не всегда позволяет, но если из видео нужна лишь theora, то плеер можно слепить за несколько дней и свой.
Сквозняк
энтузиаст
 
Сообщения: 548
Зарегистрирован: 29.06.2006 22:08:32

Re: Разрешение экрана

Сообщение Cheb » 20.10.2017 00:30:59

Тогда пиши два платформо-зависимых варианта кода сам. Для выня и для линя.

Код: Выделить всё
  function TWinApiFramework.GetScreenRect(fullscreen: boolean): TWindowManagerRect;
  var
    rc: TRect;
    Monitor: HMONITOR;
    mi: TMonitorInfo;
  begin
{
    if Mother^.State.OS in [ostWin98, OstWin2k] then with Result do begin
      //Use legacy method fow windozes older than XP
      left:= 0;
      top := 0;
      width:= GetSystemMetrics(SM_CXSCREEN);
      height:= GetSystemMetrics(SM_CYSCREEN);
      //Assuming that taskbar is at the bottom and is 28 pixels high:
      if not Fullscreen then Height-= 28;
    end
    else begin
}
      if windowhandle = 0 then begin
        //Not created yet. Use default monitor.
         with rc do begin
           left:= 0;
           top:= 0;
           right:= 1;
           bottom:= 1;
         end;
         Monitor:= MonitorFromRect(rc, MONITOR_DEFAULTTOPRIMARY);
      end else begin
        //get monitor from window
        GetWindowRect(windowhandle, rc);
        Monitor:= MonitorFromRect(rc, MONITOR_DEFAULTTONEAREST);
      end;
      mi.cbSize:= sizeof(mi);
      GetMonitorInfo(Monitor, @mi);
      if fullscreen
        then rc:= mi.rcMonitor
        else rc:= mi.rcWork;
      Result.left:= rc.left;
      Result.top:= rc.top;
      Result.width:= rc.right - rc.left;
      Result.height:= rc.bottom - rc.top;
//     end;
  end;


и

Код: Выделить всё
  function TX11Framework.GetScreenRect(fullscreen: boolean): TWindowManagerRect;
    var
      _Screen: PScreen;
      wa: TXWindowAttributes;
  begin
    {$ifdef cpuarm}
    if Assigned(BroadcomHack) then begin
      Result:= BroadcomHack.displayRect;
      Exit;
    end;
    {$endif}
    if fullscreen then begin
      _Screen:= XScreenOfDisplay(display, 0);
      Result.left:= 0;
      Result.top:= 0;
      Result.width:= _Screen^.width;
      Result.height:= _Screen^.height;
    end
    else begin
      XGetWindowAttributes(Display, DefaultRootWindow(Display), @wa);
      Result.left:= wa.x;
      Result.top:= wa.y;
      Result.width:= wa.width;
      Result.height:= wa.height;
    end;
  end;
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 590
Зарегистрирован: 06.06.2005 15:54:34

Re: Разрешение экрана

Сообщение Сквозняк » 20.10.2017 15:56:57

Cheb писал(а):Тогда пиши два платформо-зависимых варианта кода сам.

Так для видео написал уже сам, используя вышеназванный хак:) Используется движок zengl и скелет программы из его демки проигрывающей видео.
Код: Выделить всё
procedure Timer;
BEGIN
wnd_SetCaption(PLEER5+'[ FPS: '+u_IntToStr(zgl_get(RENDER_FPS))+']');
IF key_Press(K_ESCAPE) Then zgl_Exit();
// EN: If left mouse button is down on progress bar, then seek the video.
// RU: Если зажата левая кнопка мыши над полосой прогресса - перемещаться по видео.
IF GRADUSNIK THEN IF mouse_Down(M_BLEFT) AND (mouse_Y()>VYSOTA-40)
  AND (mouse_Y()<VYSOTA-40+20) THEN
    BEGIN
    videoSeek:=TRUE;
    video_Seek(video,(mouse_X()/SIRINA)*video^.Info.Duration);
    END ELSE
  videoSeek:=FALSE;
  key_ClearState();
  mouse_ClearState();
IF IN_2(1,PRINUDILOVKA_SIRINA,PRINUDILOVKA_VYSOTA) THEN BEGIN
   IF PRINUDILOVKA_SIRINA=1 THEN SIRINA:=VIDEO^.INFO.WIDTH;
   PRINUDILOVKA_SIRINA:=0;
   IF PRINUDILOVKA_VYSOTA=1 THEN VYSOTA:=VIDEO^.INFO.HEIGHT;
   PRINUDILOVKA_VYSOTA:=0;
   IF POLNOEKRANNSTJ THEN BEGIN
                          zgl_Enable(CORRECT_RESOLUTION);//ВКЛЮЧИТЬ КОРРЕКЦИЮ РАЗРЕШЕНИЯ
                          scr_CorrectResolution(SIRINA,VYSOTA);//УСТАНОВИТЬ РОДНОЕ РАЗРЕШЕНИЕ ВИДЕО
                          scr_SetOptions(zgl_Get(DESKTOP_WIDTH),zgl_Get(DESKTOP_HEIGHT),REFRESH_MAXIMUM,POLNOEKRANNSTJ,FPS_OGRANICITJ_MAKSIMALJNOSTJ);
                          END ELSE BEGIN
                                   zgl_Disable(CORRECT_RESOLUTION);
                                   scr_SetOptions(SIRINA,VYSOTA,REFRESH_MAXIMUM,POLNOEKRANNSTJ,FPS_OGRANICITJ_MAKSIMALJNOSTJ);
                                   END;
                                                        END;
END;

С видео нормально, автоповтор работает без моргания, градусник по желанию - можно использовать для theora с 444P цветовой палитрой вместо системных плееров, которые в проект не всегда положишь из-за лицензионных ограничений. Ещё надо будет сделать проигрывание аудиофайлов без открытия окна с графикой. Если запуск будет быстрый, то можно использовать.
Сквозняк
энтузиаст
 
Сообщения: 548
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru