Näillä procedure:illa voit kätevästi vaihtaa näytön resoluution ja bitit. Koodi on toiminut moitteettomasti neljällä viidestä koneesta, eli kolmella Xp ja yhdellä Windows 98 -käyttöjärjestelmällä.
Koodiin ei toivottavasti kenekään tarvi koskea(ei sillä että ei saisi), sillä resoluution vaihto tapahtuu parilla yksinkertaisella käskyllä:
procedure ChangeResolution(Width, Height, Bits);
-Vaihtaa resoluution halutuksi esim. ChangeResolution(800, 600, 16);
Procedure ResoreResolution;
-Palauttaa alkuperäisen resoluution.
Huom!
1.Älä kutsu RestoreResolution ennen kuin olet kutsunut ChangeResolution, voi olla että se pimentää näytön.
2.Älä käytä ChangeResolution:iä kahdesti ilman ResoreResolution:iä välissä, sillä ohjelma ei saa palautettua alkuperäistä resoluutioa.
Koodvinkkiä saa käyttää kaupallisiin ja ei-kaupallisiin sovelluksiin. En jaksanut kommentoida koodivinkkiä koska kaikki siinä ei ole minullekaan täysin kirkasta.
unit Display;
interface
uses
Windows,
Forms,
Dialogs;
var
OriginalRes,
NewRes : TDeviceMode;
procedure ChangeResolution(Width, Height: Word; Bits: Byte);
procedure RestoreResolution;
implementation
procedure ChangeResolution(Width, Height: Word; Bits: Byte);
var
i : integer;
liRetValue : Longint;
BitHandle : THandle;
OldBits : Byte;
begin
BitHandle := GetDC(0);
OldBits := GetDeviceCaps(BitHandle,bitspixel*
GetDeviceCaps(BitHandle,planes));
{$IFOPT R+}
{$DEFINE CKRANGE}
{$R-} //range-checking of
{$ENDIF}
i := 0;
while EnumDisplaySettings(nil, i, OriginalRes) do
begin
with OriginalRes do
if (dmPelsWidth = Cardinal(Screen.Width)) and
(dmpelsheight = Cardinal(Screen.Height)) and
(dmbitsperPel = Cardinal(OldBits)) then
Break;
inc(i);
end;
i := 0;
while EnumDisplaySettings(nil,i,NewRes) do
begin
with NewRes do
if (dmPelsWidth = Cardinal(Width)) and
(dmpelsheight = Cardinal(Height)) and
(dmbitsperPel = Cardinal(Bits)) then
begin
if EnumDisplaySettings(nil,i,NewRes) then
begin
liRetValue := ChangeDisplaySettings(NewRes,0);
case liRetValue of
DISP_CHANGE_BADFLAGS : ShowMessage('DISP_CHANGE_BADFLAGS: An invalid set of flags was passed in.');
DISP_CHANGE_FAILED : ShowMessage('DISP_CHANGE_FAILED: The display driver failed the specified graphics mode');
DISP_CHANGE_BADMODE : ShowMessage('DISP_CHANGE_BADMODE: The graphics mode is not supported');
DISP_CHANGE_NOTUPDATED: ShowMessage('DISP_CHANGE_NOTUPDATED: Unable to write settings to the registry.');
end;
{$IFDEF CKRANGE}
{$UNDEF CKRANGE}
{$R+} //range-checking on
{$ENDIF}
Exit;
end;
end;
inc(i);
end;
{$IFDEF CKRANGE}
{$UNDEF CKRANGE}
{$R+} //range-checking on
{$ENDIF}
Showmessage ('Can''t change display resolution')
end;
procedure RestoreResolution;
begin
ChangeDisplaySettings(OriginalRes,0);
end;
end.Teitpäs hankalaksi! Itse sain saman paljon pienempään tilaan...
Nykyiset asetukset saa muuten tällä:
EnumDisplaySettings(nil, Cardinal(-1), MinneLaitetaan);
Edit: Et muuten huomioi hertsilukemaa... Oletus taitaa olla 60Hz, ja se on hyvin ikävä mikäli ei omista TFT-näyttöä.
lainaus:
EnumDisplaySettings(nil, Cardinal(-1), MinneLaitetaan);
Empä tiennyt. Koodi muuten pohjautuu Delphi.About.com:in Get'n'set display-ohjelmaan.
Jos koodisi on paljon lyhyempi ja saat tuon herstijutun mukaan niin lähetä se koodivinkkeihin kun tuo on kyllä aika epäkäytännöllinen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.