Разрешение экрана
Модератор: Модераторы
Разрешение экрана
Как в паскале можно узнать текущее разрешение экрана в Windows? В Delphi есть screen.height\screen.width, но мне надо без совместимости с делфёй
Если только для Windows, то есть API функция GetSystemMetrics.
но мне надо без совместимости с делфёй
Всмысле? Без совместимости с Lazarus (LCL) на чистом FPC? Или именно с дельфой?!!! А то у формы лазаруса то же есть вышеназванные свойства...
qivi писал(а):но мне надо без совместимости с делфёй
Всмысле? Без совместимости с Lazarus (LCL) на чистом FPC? Или именно с дельфой?!!! А то у формы лазаруса то же есть вышеназванные свойства...
GetSystemMetrics уже помогло, всем спасибо
Не так чтобы через чур было надо, но если есть способ без лазаруса и прочих тяжёлых, а также медленных, зависимостей узнать кроссплатформенно (линукс и виндовс) текущее разрешение экрана, то пригодилось бы.
Разобрался. Если перед запуском графического движка не узнать разрешение экрана, то надо запустить движок с малюсеньким размером окна, в оконном видеорежиме, а на следующем кадре узнать размер экрана и перезапустить окно с новыми размерами.
Точно также, если при програмном перемещении курсора мыши в каком-то из видеорежимов промахиваетесь, то на следующем кадре можно сделать второй прыжок курсора и поставить его куда надо
Точно также, если при програмном перемещении курсора мыши в каком-то из видеорежимов промахиваетесь, то на следующем кадре можно сделать второй прыжок курсора и поставить его куда надо
Как все запущено. Правильнее будет использовать TScreen.
http://lazarus-ccr.sourceforge.net/docs/lcl/forms/tscreen.html
http://lazarus-ccr.sourceforge.net/docs/lcl/forms/tscreen.html
Это правильное тянет за собой создание полновесного лазарусного приложения, а у меня лёгкий плеер для проигрывания двух форматов файлов, мелкого размера, из которого выкинуто всё лишнее. mplayer конечно хорош, но таскать его с проектом лицензия не всегда позволяет, но если из видео нужна лишь theora, то плеер можно слепить за несколько дней и свой.
Тогда пиши два платформо-зависимых варианта кода сам. Для выня и для линя.
и
Код: Выделить всё
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 писал(а):Тогда пиши два платформо-зависимых варианта кода сам.
Так для видео написал уже сам, используя вышеназванный хак:) Используется движок 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 цветовой палитрой вместо системных плееров, которые в проект не всегда положишь из-за лицензионных ограничений. Ещё надо будет сделать проигрывание аудиофайлов без открытия окна с графикой. Если запуск будет быстрый, то можно использовать.
