| Autor |
Beitrag |
.50AE
      
Beiträge: 100
|
Verfasst: 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)
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:
| if (TestResolution(800,600,16) = false) then lbadres.Visible := true else lbadres.Visible := false;
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:
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:
| ChangeResolution(800,600,16);
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 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; if Result = true then ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN) end; Inc(i); end; end; |
Wenn ich z.B. 80 1x600 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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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 
      
Beiträge: 100
|
Verfasst: 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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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
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 
      
Beiträge: 100
|
Verfasst: 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?
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; l := 0; while EnumDisplaySettings(nil, l, DeviceMode) do begin with DeviceMode do freq := dmDisplayFrequency; Inc(l); end; 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 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; if Result = true then ChangeDisplaySettings(DeviceMode, CDS_FULLSCREEN) end; Inc(i); end; end; |
MfG
50ae
|
|
|