Delphi-Quellcode:
function AnotherScreen(Width, Height: Word): Boolean;
var
lpDevMode: TDeviceMode;
begin
Result := EnumDisplaySettings(nil, 0, lpDevMode);
if Result then
begin
lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT;
lpDevMode.dmPelsWidth := Width;
lpDevMode.dmPelsHeight := Height;
Result := ChangeDisplaySettings(lpDevMode,
CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AnotherScreen(1024, 768); //Hier also die Auflösung eingeben
end;
Nachtrag:
Fox007 hat den Code soweit erweitert, das jetzt auch die Bildwiederholfrequenzauch gleich mit geändert wird.
Danke dafür! Und hier ist der geänderte Code.
Delphi-Quellcode:
function AnotherScreen(Width, Height: Word; Freq :Cardinal): Boolean;
var
lpDevMode: TDeviceMode;
begin
Result := EnumDisplaySettings(nil, 0, lpDevMode);
if Result then
begin
lpDevMode.dmFields := DM_PELSWIDTH Or DM_PELSHEIGHT Or DM_DISPLAYFREQUENCY;
lpDevMode.dmPelsWidth := Width;
lpDevMode.dmPelsHeight := Height;
lpDevMode.dmDisplayFrequency := Freq;
Result := ChangeDisplaySettings(lpDevMode,
CDS_UPDATEREGISTRY) = DISP_CHANGE_SUCCESSFUL;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
AnotherScreen(1280, 1024, 85)
end;
Grüsse, Daniel
Von turboPASCAL kommt folgende erweiterte Version:
Delphi-Quellcode:
function ChangeRes(X, Y: Integer; Frequency: Byte; FullScreen: Boolean): Boolean;
var
DevMode: TDeviceMode;
begin
// Initialisieren
EnumDisplaySettings(nil, 0, DevMode);
DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_DISPLAYFREQUENCY;
DevMode.dmDisplayFrequency := Frequency;
DevMode.dmPelsWidth := X;
DevMode.dmPelsHeight := Y;
// Auflösung ändern
if FullScreen then
Result := ChangeDisplaySettings(DevMode, CDS_FULLSCREEN) = DISP_CHANGE_SUCCESSFUL else
Result := ChangeDisplaySettings(DevMode, 0) = DISP_CHANGE_SUCCESSFUL;
end;
// Aufruf zB.:
begin
//...
If not ChangeRes(800, 600, 0, True) then
begin
MessageBox(0,
'Das ändern der Auflösung ist fehlgeschlagen ...',
'Fehler:', MB_OK or MB_ICONERROR);
Exit;
end;
//...
// Normale, in Windows eingestellte Bildschirmauflösung wiederherstellen:
ChangeDisplaySettings(PDeviceMode(nil)^, 0);
end;
Beim Umschalten ohne Fullscreen werden die Fenster, die sich auf dem Desktop befinden, von Windows neu plaziert. Die Auflösung ist hierbei nicht temporär. Ist Fullscreen gewählt werden diese Fenster nicht neu positioniert und nur die Auflösung geändert. Das Umschalten der Auflösung ist hierbei nur temporär.
Wenn bei Frequency "0" angegeben wird, setzt Windows die passende Auflösung (wenn möglich).
Es ist nicht gut, einfach eine Auflösung vorzugeben, da auch TFT's nicht immer 1024 x 768 mit 60 Hz darstellen,
Die Frequenz muss man dan auch erst mittels
GetDeviceCaps auslesen/bestimmen.
zB.:
Delphi-Quellcode:
DC := GetDC(
Handle);
Bits := GetDeviceCaps(
DC, BITSPIXEL);
HRes := GetDeviceCaps(
DC, HORZRES);
VRes := GetDeviceCaps(
DC, VERTRES);
Freq := GetDeviceCaps(
DC, VREFRESH);
//<---<<<
[edit=Matze]Weitere Version hinzugefügt. Mfg, Matze[/edit]