Entwickler-Ecke

Windows API - Bildschirmauflösung ändern funktioniert nicht!


Shasta2103 - Di 25.09.07 22:54
Titel: Bildschirmauflösung ändern funktioniert nicht!
Hallo,

Ich verwende für mein Spiel folgende Funktion zum Ändern der Bildschirmauflösung.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
function ChangeResolution(sizex, sizey, bpp: DWORD): Boolean;
var DeviceMode: TDeviceModeA;
    i: Integer;
    nMouseSpeed: Cardinal;
begin
 i := 0;
 Result := False;
 while EnumDisplaySettings(nil, i, DeviceMode) do
 begin
   with DeviceMode do
     if (dmPelsWidth = sizex) and
     (dmPelsHeight = SizeY) and
     (dmBitsPerPel = bpp) then
     begin
       // erst testen, bevor wir umschalten!
       case ChangeDisplaySettings(DeviceMode, CDS_TEST) of
         // es wird klappen!
         DISP_CHANGE_SUCCESSFUL:
           Result := True;

         DISP_CHANGE_RESTART:
           Showmessage('Neustart erforderlich');

         DISP_CHANGE_BADFLAGS:
           Showmessage('Ungültige Bildschirmeinstellungen');

         DISP_CHANGE_FAILED:
           Showmessage('Auflösung konnte nicht geändert werden');

         DISP_CHANGE_BADMODE:
           Showmessage('Bildschirm unterstützt diese Auflösung nicht');

         // Nur Windows NT
         DISP_CHANGE_NOTUPDATED:
           Showmessage('Registry konnte nicht aktualisiert werden');
       else
         Result := True;
       end;
     end;
   Inc(i);
 end;

 if Result then
 begin
  //jetzt wird umgeschaltet
  ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN);

  //Mausgeschwindigkeit ändern
  nMouseSpeed:=8;
  SystemParametersInfo(SPI_SETMOUSESPEED, 0, Pointer(nMouseSpeed),
      SPIF_SENDCHANGE);
 end;
end;


Das Spiel hat eine Auflösung von 1024x768.

Auf meinem Pc funktioniert diese Funktion einwandfrei.
Ich lasse mein Spiel jedoch gerade von einigen Leuten testen und bei ihnen startet das Spiel in einer
Auflösung von 640x480 & Farbtiefe von 8Bit oder es kommt zum totalen Wirrwarr.
Es ist also unspielbar. Ich kann es leider auch nur anhand ihrer Erzählungen beschreiben.

Ihre Systeme unterstützen auf jeden Fall diese Auflösung!
Ich wäre froh, wenn ihr mir weiterhelfen könntet.


arj - Di 25.09.07 23:03

Wenn ich das richtig gesehen hab, dann nimmst du immer die letzte noch funktionierende Auflösung die
EnumDisplaySettings liefert und verwendest diese.

Wer sagt dir aber, dass EnumDisplaySettings diese aufsteigend liefert?


Shasta2103 - Di 25.09.07 23:08

Ok das könnte es sein.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if Result then
 begin
  //jetzt wird umgeschaltet
  ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN);

  //Mausgeschwindigkeit ändern
  nMouseSpeed:=8;
  SystemParametersInfo(SPI_SETMOUSESPEED, 0, Pointer(nMouseSpeed),
      SPIF_SENDCHANGE);
end;


Ich hatte diesen Teil vorher oben drin stehen, so wie man die Funktion überall findet, nur leider
hat er statt alle Auflösung NUR zu testen (CDS_TEST), jede einzelne durchgeschalten,
was ungefähr ne halbe minute gedauert hat und absolut nervig war. Sollte das so sein?