Entwickler-Ecke

Windows API - Bildwiederholfrequenz auslesen / ändern


alexschultze - Sa 26.10.02 17:11
Titel: Bildwiederholfrequenz auslesen / ändern
hi

ich hab ein Programm, dass mithilfe von


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 - 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.


alexschultze - 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 - Fr 01.11.02 19:19

War schon länger nicht mehr hier, aber ein ungetestetes Codebeispiel bekommst du trotzdem:

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.