По дате Октябрь 5th, 2008

Как изменить разрешение экрана (Win32 API)

В свое время вставала задача программно изменить разрешение экрана монитора в windows.

Для изменения разрешения экрана есть специальная функция WIN32 API с именем ChangeDisplaySettings в неё необходимо передать указатель на структуру типа DEVMODE, где указывается желаемое разрешение. Естественно, что Ваш монитор и видеокарта должны это разрешение поддерживать.

Естественно, хорошим тоном будет предварительное сохранение предыдущих настроек экрана и возврат после окончания работы программы (или той части программы, где изменяется разрешение) .

// Screen.cpp : Defines the entry point for the console application.
//
#include “stdafx.h”
#include “windows.h”
void main(){
DEVMODE dm;
memset(&dm,0,sizeof(DEVMODE));
dm.dmSize=sizeof(DEVMODE);
dm.dmPelsWidth=800;
dm.dmPelsHeight=600;    dm.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;    ChangeDisplaySettings(&dm,CDS_UPDATEREGISTRY);
}

form.top=screen.height/2-form.height/2
form.left=screen.width/2-form.width/2

// Еще один вариант получения информации о мониторе

procedure TForm1.Button1Click(Sender: TObject);
Var    TC,BPP,CP,VR,x:  integer; x2:real;
begin
BPP:=GetDeviceCaps(Form1.Canvas.Handle,BITSPIXEL);
CP:=GetDeviceCaps(Form1.Canvas.Handle,PLANES);
x2:=intpower(2,BPP);
x2:=intpower(x2,CP); TC:=round(x2);
Label1.Caption:=’Бит на пиксел: ‘+IntToStr(BPP);
if (TC<3) then  Label2.Caption:=’Монохромный дисплей ‘ else
Label2.Caption:=’Число цветов: ‘+IntToStr(TC);
end;

//
VR:=GetDeviceCaps(Form1.Canvas.Handle,VREFRESH);

// непосредственно.. Изменить разрешение монитора
procedure Display( X, Y : Word );
var
dm : TDEVMODE;
begin
ZeroMemory( @dm, sizeof( TDEVMODE ) );
dm.dmSize := sizeof ( TDEVMODE );
dm.dmPelsWidth := X;
dm.dmPelsHeight := Y;
dm.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
ChangeDisplaySettings( dm, 0 );
end;
// установить разрешение монитора

procedure SetScreen(BPP: byte; width, height, FR: integer);
var
D: TDevMode;
h: HWND;
begin
h:=0;
D.dmDeviceName:=’DISPLAY’;
D.dmBitsPerPel:=BPP;
D.dmDisplayFrequency:=FR;
D.dmPelsWidth:=Width;
D.dmPelsHeight:=Height;
D.dmFields:=DM_BITSPERPEL+DM_PELSWIDTH+DM_PELSHEIGHT+DM_DISPLAYFREQUENCY;
D.dmSize:=SizeOf(D);
if ChangeDisplaySettings(D,CDS_TEST)=DISP_CHANGE_SUCCESSFUL then
ChangeDisplaySettings(D,CDS_UPDATEREGISTRY)
else
MessageBox(h,’Этот режим не поддерживается видеокартой.’,
‘Ошибка изменения режима!’, MB_ICONWarning);
end;

Вызывается так: SetScreen(глубина цвета, разрешение по горизонтали, разрешение по вертикали, частота в герцах);
Например:
SetScreen(16,800,600,80); {16 бит цвет, 800х600, 80Гц.}

* Найдено на форумах, опробовано и сведено воедино давненько. Просьба отписаться, если работает. :)

Опубликовано Октябрь 5, 2008 | автор: levik  |  Комментарии (2) »