Bildschirmauflösung ändern

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...

Bildschirmauflösung ändern

Beitragvon Nicki2016 » 27. Jan 2017, 11:50 Bildschirmauflösung ändern

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
Nicki2016
 
Beiträge: 6
Registriert: 27. Jan 2017, 11:39

Beitragvon Michl » 27. Jan 2017, 13:31 Re: Bildschirmauflösung ändern

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; 
Michl
 
Beiträge: 2258
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Nicki2016 » 27. Jan 2017, 14:14 Re: Bildschirmauflösung ändern

Hallo Michl,

vielen Dank für deine schnelle Antwort
Nicki2016
 
Beiträge: 6
Registriert: 27. Jan 2017, 11:39

Beitragvon Nicki2016 » 27. Jan 2017, 14:42 Re: Bildschirmauflösung ändern

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
Nicki2016
 
Beiträge: 6
Registriert: 27. Jan 2017, 11:39

Beitragvon Timm Thaler » 27. Jan 2017, 16:01 Re: Bildschirmauflösung ändern

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.
Timm Thaler
 
Beiträge: 581
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.64 FPC3.0.4, Raspbian Stretch Laz1.62 FPC3.0.2 | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon Nicki2016 » 27. Jan 2017, 16:57 Re: Bildschirmauflösung ändern

wie kann ich denn einen eigenen Screen erstellen? Kann ich die Auflösung vom Canvas irgendwie ändern?
Nicki2016
 
Beiträge: 6
Registriert: 27. Jan 2017, 11:39

Beitragvon Mathias » 27. Jan 2017, 18:14 Re: Bildschirmauflösung ändern

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3993
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Nicki2016 » 27. Jan 2017, 18:45 Re: Bildschirmauflösung ändern

Hallo Mathias,

vielen Dank für deine wertvollen Hinweise.

lg,

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

Beitragvon Nicki2016 » 27. Jan 2017, 19:10 Re: Bildschirmauflösung ändern

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
Nicki2016
 
Beiträge: 6
Registriert: 27. Jan 2017, 11:39

• Themenende •

Zurück zu Multimedia



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

porpoises-institution
accuracy-worried