Bildschirmauflösung ändern
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
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
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:
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;
Re: Bildschirmauflösung ändern
Hallo Michl,
vielen Dank für deine schnelle Antwort
vielen Dank für deine schnelle Antwort
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
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
-
- 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
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.
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.
Re: Bildschirmauflösung ändern
wie kann ich denn einen eigenen Screen erstellen? Kann ich die Auflösung vom Canvas irgendwie ändern?
-
- Beiträge: 6164
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Bildschirmauflösung ändern
Mit dieser Funktion sollte es gehen, nach Programm-Ende, sollte die alte Auflösung wieder kommen.
Viele Games nutzen diese Funktion, ansonsten hast du schon recht.
Ja, dies ist sehr wichtig, vor allem bei der Unit Windows.
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
Mit Java und C/C++ sehe ich rot
Re: Bildschirmauflösung ändern
Hallo Mathias,
vielen Dank für deine wertvollen Hinweise.
lg,
Nicki2016
vielen Dank für deine wertvollen Hinweise.
lg,
Nicki2016
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
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