Autor Beitrag
alexschultze
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Sa 26.10.02 17:11 
hi

ich hab ein Programm, dass mithilfe von

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function change_resolution(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;


Wenn ich von 1024x768 auf 640xndere, sinkt die Bildwiederhilfrequenz extrem. (60 HZ glaub ich mal..)

Gibt es
a) eine Möglichkeit die Auslösung ohne BWH-Änderung umzustellen
b) Die BWH auszulesen und wieder einzustellen


alex
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Sa 26.10.02 18:57 
a) Windows stellt beim Ändern der Auflösung die Bildwiederholfrequenz aus Sicherheitsgründen auf einen niedrigen, also sicheren Wert.
Du solltest dir im klaren sein, dass es ein Unterschied ist, ob du nur die Auflösung oder den Anzeigemodus änderst. Letzteres machst du mit ChangeDisplaySettings(). Ein Anzeigemodus besteht aus einer Auflösung (Breite, Höhe, Farbtiefe) und eben Bildwiederholfrequenz. Wenn du also noch bei TDeviceMode.dmFields noch DM_DISPLAYFREQUENCY hinzufügst und TDeviceMode.dmDisplayFrequency auf die neue Frequenz setzt, wird das gleich mit erledigt. Du kannst also hier auch einfach die alte Frequenz angeben. Beachte aber, dass zum Beispiel kaum ein Monitor 1024x768 mit 120 Hz anzeigen kann, wohl aber 640x480 mit 85 Hz.

b) Die aktuelle Bildwiederholfrequenz kannst du, wenn ich nicht irre, mit EnumDisplaySettings() auslesen, indem du ENUM_CURRENT_SETTINGS als zweiten Parameter übergibst.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
alexschultze Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Sa 26.10.02 19:19 
ich habe nur vor, die BWH beizubehalten, egal ob sie 1024x768 oder 800x600 haben...
da geht nix kaputt ;)

am liebsten wäre mir ein kurzes COdebeispiel!
(vor allem mit dem bekommen der BWH)
OregonGhost
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 215



BeitragVerfasst: Fr 01.11.02 19:19 
War schon länger nicht mehr hier, aber ein ungetestetes Codebeispiel bekommst du trotzdem:
ausblenden Quelltext
1:
2:
3:
4:
5:
var dm: TDevMode;
...
dm.dmSize := sizeof(TDevMode);
dm.dmDriverExtra := 0;
EnumDisplaySettings(nil, ENUM_CURRENT_SETTINGS, @dm);

Achtung: Borland deklariert sowas gerne anders. Wenn's nicht kompiliert, das @ einfach mal wegnehmen.
So, jetzt enthält dm.dmDisplayFrequency die aktuelle Bildwiederholfrequenz.
Diesen DEVMODE änderst du jetzt einfach ab, indem du die Member dmPelsWidth, dmPelsHeight und dmBitsPerPel änderst. Dann musst du das Member dmFields auf (DM_BITSPERPEL or DM_DISPLAYFREQUENCY or DM_PELSWIDTH or DM_PELSHEIGHT) setzen.
Und nun kannst du einfach wie gewohnt ChangeDisplaySettings() aufrufen. Ich empfehle als zweiten Parameter allerdings eine 0, aber da kommt's drauf an was du willst.

_________________
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.