![]() |
Wie kann ich die Bildschirmauflösung ändern?
Delphi-Quellcode:
Nachtrag:
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; 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:
Grüsse, Daniel :hi:
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; Von turboPASCAL kommt folgende erweiterte Version:
Delphi-Quellcode:
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.
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; 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:
[edit=Matze]Weitere Version hinzugefügt. Mfg, Matze[/edit]
DC := GetDC(Handle);
Bits := GetDeviceCaps(DC, BITSPIXEL); HRes := GetDeviceCaps(DC, HORZRES); VRes := GetDeviceCaps(DC, VERTRES); Freq := GetDeviceCaps(DC, VREFRESH); //<---<<< |
Aufgrund mancher Anfragen möchte ich noch was dazu sagen!
Es geht um Auflösungen die ein Monitor nicht kann. Sollte man eine Auflösung einstellen, die der Monitor nicht kann, dann wird der Monitor ein total verzerrtes Bild anzeigen. Lauter bunte Pixel und sonst nicht. Es ist also nichts mehr erkennbar. Sollte es manchen Monitoren nicht gefallen, dann schalten sie wegen überlastung/überhitzung ab! Gemeint sind eher Monitore die wirklich alt sind, 15-20 Jahre. Die heutigen haben da schon andere Schutzmechanismen. Sollte das alles nicht zutreffen, dann einfach im Abgesicherten Modus neustarten und die Auflösung wieder normal einstellen. Kleine Vorsichtsmassnahme! Auf dem Formular womit man dies ausprobiert, sollte man noch einen Button erzeugen, mit der gleichen Prozedur, allerdings einer kleineren Auflösung, die die man normalerweise hat. Und sobald man den ersten Button, mit der höheren Auflösung drückt, sollte man dem zweiten den Fokus setzen. Dies geht einfach Button2.SetFocus;. Ist also alles nach dem umstellen verzerrt, so muss man nur noch Enter drücken und schon hat man wieder die normale Auflösung. Dies ist brauchbar, den die Einstellungen treten sofort in Kraft, es muss nicht neu gestartet werden! Grüsse, Daniel :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz