Bildschirmauflösung ändern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Nicki2016
Beiträge: 6
Registriert: Fr 27. Jan 2017, 11:39

Bildschirmauflösung ändern

Beitrag von Nicki2016 »

Hallo zusammen,

dies ist mein erster Beitrag im Forum. Ich hoffe ich mache alles richtig.
Ich möchte aus einer laufenden Lazarus-Anwendung die Bildschirmauflösung ändern, weil die Animationen bei niedrigerer Auflösung deutlich flüssiger laufen. Ich habe schon eine sehr lange Internet-Recherche hinter mir. Es werden häufig Möglichkeiten für Delphi dargestellt. Diese Proceduren/Funktionen bekomme ich aber nicht zum laufen. Unter anderem, weil ich keine Variablen vom Typ TDeviceMode deklarieren kann. Ich weiß nicht, welche Unit dafür aufgeführt werden muss. Ich habs mal mit der Unit Windows (die ich als mögliche identifiziert habe) versucht. Bei diesem Versuch werden allerdings die Canvas-Befehle (die sonst super funktionieren) als fehlerhaft angezeigt.
Am besten wäre natürlich, dass die ursprüngliche Bildschirmauflösung, die vor der Programm-Anwendung bestand, nach Ausführung dessen wieder hergestellt wird.

Ich würde mich sehr freuen, wenn mir einer helfen könnte.

Viele Grüße,

Nicki 2016

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Bildschirmauflösung ändern

Beitrag von Michl »

Hallo und willkommen!

Generell sollte man die Bildschirmauflösung nicht verändern und diese Einstellung dem User überlassen. Alles andere würde ich als Nutzer als Bug interpretieren.

Wie auch immer, die Lösung von dieser Seite http://www.swissdelphicenter.ch/en/showcode.php?id=158 funktioniert hier (Windows 7) problemlos und auch nur für Windows:

Code: Alles auswählen

uses ..., Windows;
...
  TForm1 = class(TForm)
  private
    OldResulution: TRect;
  end;
...
procedure ChangeResolution(XResolution, YResolution: DWORD);
var
  DevMode: TDeviceMode;
begin
  EnumDisplaySettings(nil, 0, DevMode);
  DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT;
  DevMode.dmPelsWidth := XResolution;
  DevMode.dmPelsHeight := YResolution;
  ChangeDisplaySettings(DevMode, 0);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  OldResulution.Right  := Screen.Width;
  OldResulution.Bottom := Screen.Height;
  ChangeResolution(1024, 768);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ChangeResolution(OldResulution.Right, OldResulution.Bottom);
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Nicki2016
Beiträge: 6
Registriert: Fr 27. Jan 2017, 11:39

Re: Bildschirmauflösung ändern

Beitrag von Nicki2016 »

Hallo Michl,

vielen Dank für deine schnelle Antwort

Nicki2016
Beiträge: 6
Registriert: Fr 27. Jan 2017, 11:39

Re: Bildschirmauflösung ändern

Beitrag von Nicki2016 »

Hey Michl,

ich danke dir schön. Habs ausprobiert und es funktioniert super.
Nebenbei: Wenn ich die Unit Windows an den Anfang der aufgeführten Units setze, dann gibt es auch keine störende Interaktion mit den Canvas-Befehlen, so daß die Reihenfolge der Units offenbar auch wichtig ist.

lg,

Nicki2016

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: Bildschirmauflösung ändern

Beitrag von Timm Thaler »

Wenn Du mit eigener Auflösung arbeiten willst, dann mach einen eigenen Screen auf. Da kannst Du dann Auflösung und Farbtiefe einstellen, wie Du lustig bist.

Ein Programm, welches meine Bildschirmauflösung zerschlägt, würde bei mir genau einmal laufen. So wichtig kann ein Programm gar nicht sein, dass es derart in mein System eingreifen dürfte.

Nicki2016
Beiträge: 6
Registriert: Fr 27. Jan 2017, 11:39

Re: Bildschirmauflösung ändern

Beitrag von Nicki2016 »

wie kann ich denn einen eigenen Screen erstellen? Kann ich die Auflösung vom Canvas irgendwie ändern?

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bildschirmauflösung ändern

Beitrag von Mathias »

Mit dieser Funktion sollte es gehen, nach Programm-Ende, sollte die alte Auflösung wieder kommen.

Code: Alles auswählen

procedure GoToFullScreen(Form: TForm; pWidth, pHeight, pBPP, pFrequency: word);
var
  dmScreenSettings: DevMode;
begin
  // Fenster vor Vollbild vorbereiten
  Form.WindowState := wsMaximized;
  Form.BorderStyle := bsNone;
  ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  with dmScreenSettings do begin
    dmSize := SizeOf(dmScreenSettings);
    dmPelsWidth := pWidth;                    // Breite
    dmPelsHeight := pHeight;                  // Höhe
    dmBitsPerPel := pBPP;                     // Farbtiefe
    dmDisplayFrequency := pFrequency;         // Bildwiederholfrequenz
    dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  end;
  if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then begin
    MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
    exit;
  end;
end;


Generell sollte man die Bildschirmauflösung nicht verändern und diese Einstellung dem User überlassen. Alles andere würde ich als Nutzer als Bug interpretieren.

Viele Games nutzen diese Funktion, ansonsten hast du schon recht.

Wenn ich die Unit Windows an den Anfang der aufgeführten Units setze, dann gibt es auch keine störende Interaktion mit den Canvas-Befehlen, so daß die Reihenfolge der Units offenbar auch wichtig ist.

Ja, dies ist sehr wichtig, vor allem bei der Unit Windows.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nicki2016
Beiträge: 6
Registriert: Fr 27. Jan 2017, 11:39

Re: Bildschirmauflösung ändern

Beitrag von Nicki2016 »

Hallo Mathias,

vielen Dank für deine wertvollen Hinweise.

lg,

Nicki2016

Nicki2016
Beiträge: 6
Registriert: Fr 27. Jan 2017, 11:39

Re: Bildschirmauflösung ändern

Beitrag von Nicki2016 »

Hallo Mathias,

vielen Dank für den tollen Hinweis. Hab die Procedur umgesetzt und sie funktioniert super. Ich habe die Parameter Farbtiefe und Wiederholfrequenz allerdings weggelassen.

lg

nicki

Antworten