Autor Beitrag
.50AE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Di 20.02.07 19:00 
Hi,

für mein Spiel möchte ich die Auflösung des Monitors temporär ändern.

In den Spieleinstellungen prüfe ich anhand dieser Funktion, ob die Auflösung okay ist.
(800x600 oder 1024x768 jeweils mit 16-Bit)
ausblenden 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:
//Wenn man einen Grafikmodus auswählt:
if (TestResolution(800,600,16) = false) then lbadres.Visible := true
     else lbadres.Visible := false;

//Die Funktion (von dsdt.info, leicht abgeändert)
function Tmain.TestResolution(sizex, sizey, bpp: DWORD): Boolean;
var
 DeviceMode: TDeviceModeA;
 i: Integer;
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
       case ChangeDisplaySettings(DeviceMode, CDS_TEST) of
         DISP_CHANGE_SUCCESSFUL:
           Result := True;
       else
         Result := False;
       end;
     end;
   Inc(i);
 end;
end;


So. Die Funktion gibt aus, dass der Modus anwendbar ist.
Wenn das Spiel dann mit dieser Auflösung starten soll zeigt mein Monitor allerdings die Meldung: VGA Mode not supported.
Über die Windowseinstellungen kann ich die Auflösung aber sehr wohl auf 800x600,16Bit ändern.

Im folgenden noch der Code zum tatsächlichen Ändern der Auflösung:
ausblenden volle Höhe 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:
//Aufruf:
ChangeResolution(800,600,16);

//Funktion
function Tfplay.ChangeResolution(sizex, sizey, bpp: DWORD): Boolean;
var
 DeviceMode: TDeviceModeA;
 i: Integer;
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
       //Auflösung wird hier nochmal geprüft und als OK angegeben.
       case ChangeDisplaySettings(DeviceMode, CDS_TEST) of
        DISP_CHANGE_SUCCESSFUL: Result := True;
       else
        begin
        result := false; 
        abortgame('Resolution couldn''t be changed. Please try another resolution.');
        end;
       end;
       //Auflösung Umschalten
       if Result = true then
         ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN)
     end;
   Inc(i);
 end;
end;


Wenn ich z.B. 801x600 oder so als Auflösung angebe gibt die Funktion False zurück; wie es sein sollte.
Was stimmt da jetzt nicht?

MfG
50ae


Zuletzt bearbeitet von .50AE am Fr 23.02.07 12:04, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 20.02.07 19:23 
Moin!

Ich gebe zu, ich habe mir weder den Code näher angesehen, noch was du da genau machst, aber von der Fehlermeldung her würde ich sagen: dein Moni kommt mit der Vfreq nicht klar (zu hoch?). ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
.50AE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Di 20.02.07 20:17 
Mh. Wenn ich die Auflösung auf 1024 ändere (die hab ich auch so schon, aber man merkt, dass sie trotzdem "geändert" wird) geht es; mit der selben Funktion...

Außerdem sollte die Frequenz durch die Funktion doch gar nicht geändert werden, oder?

MfG
50ae
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 20.02.07 20:33 
Moin!

Hast du einen Flachmann? Wenn ja, ist der in der Lage von sich zu geben, mit was du ihn da aktuell so quälst (Video-Input-Information)? ;) Flachis können selten mehr als 60Hz... :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 20.02.07 20:43 
@Narses: Mein Flachi kann 75 ... hat aber leider nen ROM-Patch drin, dass man ihn auf nativer Auflösung nicht damit quälen darf ... LEIDER :cry:

Zu deinem Problem: Deine Routine testet alle Möglichkeiten durch und bekommt dabei u.a. auch verschiedene Bildwiederholfrequenzen angeboten ... davon funktioniert mindestens eine --> Auflösung geht ...

Beim Überprüfen erwischt Du nun wiederum auch alle möglichen, bleibst aber auf der letzten stehen, die mit einer Wiederholfrequenz gekoppelt ist, die dein Monitor nicht kann ...

Erweiter mal deine Funktion so, dass neben der Auflösung auch die Bildwiederholrate mit überprüft wird und dabei bei den angebotenen Modi maximal die angegebene Frequenz verwendet wird.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
.50AE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Di 20.02.07 20:48 
Hi,

Wenn ich einfach 60 einsetze geht es jedenfalls schonmal.

Da ich nicht möchte, dass der Benutzer die Frequenz selbst angeben muss, wäre es wohl das beste, die Frequenz vor dem benutzen der Funktion zu ermitteln, oder?

Dazu hab ich die Funktion von oben erweitert (siehe unten); aber jetzt wird die Auflösung gar nicht mehr geändert. Kann ich die Frequenz noch irgendwie anders ermitteln?
Vielleicht über die Registry?

ausblenden volle Höhe 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:
function Tfplay.ChangeResolution(sizex, sizey, bpp: DWORD): Boolean;
var
 DeviceMode: TDeviceModeA;
 i,l,freq: Integer;
begin
Result := False;
//Freq ermitteln
l := 0;
 while EnumDisplaySettings(nil, l, DeviceMode) do
  begin
  with DeviceMode do
   freq := dmDisplayFrequency;
  Inc(l);
  end;
//Auflösung...
i := 0;
 while EnumDisplaySettings(nil, i, DeviceMode) do begin
   with DeviceMode do
     if (dmPelsWidth = sizex) and
        (dmPelsHeight = SizeY) and
        (dmDisplayFrequency = freq) and
        (dmBitsPerPel = bpp) then begin
       // Erst nochmal testen (Der Benutzer kann auch eine ungültige Auflösung auswählen)
       case ChangeDisplaySettings(DeviceMode, CDS_TEST) of
        DISP_CHANGE_SUCCESSFUL: Result := True;
       else
        begin
        result := false;
        abortgame('Resolution couldn''t be changed. Please try another resolution.');
        end;
       end;
       //Umschalten
       if Result = true then
         ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN)
     end;
   Inc(i);
 end;
end;


MfG
50ae