Verfasst am: 22.11.2012, 13:17
Titel: GUI in verschiedenen Auflösungen ausführen
Hallo zusammen!
Ich hab für ein Projekt im Studium ein GUI erstellt, was auch soweit läuft...
Jetzt soll ich das aber so programmieren, das es im gleichen Verhältnis auch auf anderen Auflösungen läuft...
Habe schon alle Objekte auf "normalized" gesetzt, aber da wird z.B. die Schrift der Buttons nur teilweise augezeigt usw.
Hab mir hier im Forum schon alles zu dem Thema durchgelesen, aber das passt alles nich so wirklich zu meiner Problematik!
Verfasst am: 22.11.2012, 15:11
Titel: Re: GUI in verschiedenen Auflösungen ausführen
Hallo Turbopavel,
Zitat:
Hab mir hier im Forum schon alles zu dem Thema durchgelesen, aber das passt alles nich so wirklich zu meiner Problematik!
Das ist zu allgemein um effizient darauf antworten zu können. Vielleicht kannst Du konkret beschreiben, welche Methoden Diur aus welchen Gründen nicht weiterhelfen.
Auflösungs-unabhängige GUIs sind nicht trivial. Das sieht man z.B. daran, wie viele Programme kläglich an Apples Retina-Display scheitern, obwohl es eine spezielles API dafür gibt.
GUIs einfach auf "normalized" Units umzustellen, führt manchmal zu gruseligen Resultaten, wenn z.B. jemand einen riesigen Monitor benutzt oder eine alte Konsole mit 640*480 Pixeln. Die Einheiten absolute zu wählen ist ebenfalls möglich, also z.B. in Zentimetern. Den ein hübsches GUI ist nicht riesig oder winzig, sondern hat etwa DinA5 Größe.
1) Man braucht die Auflösung des Zielmonitors
=> ScrnSize = get(0,'ScreenSize')
2) Man braucht die Auflösung des Ursprungsmonitors,
also wo die GUI erstellt worden war.
Daraus kann man dann Skalierungsfaktor für jede Seite berechnen.
Zuerst muss man zurück skalieren (wenn das GUI auf Normalized steht), da das GUI auf neuem Monitor bereits falsch skaliert wird.
Danach nach dem kleinsten Faktor beide Seiten skalieren.
Den Algorithmus muss man in die OpeningFcn der GUI einbauen.
Aber Jan hat recht, dass GUI auf großen Monitoren dadurch riesig wird. Das kann man aber begrenzen, in dem man die Skalierungsfaktor reduziert z.B, nur 80% der neuen Skalierung verwenden.
zu 1) Also das mit ScrnSize = get(0,'ScreenSize') hab ich auch schon versucht, aber sobald ich das Programm in einer anderen Auflösung ausführe, holt sich Matlab trotzdem die ursprüngliche Auflösung, in der ich programmiert habe...
Würde das dann heißen ich muss für jede denkliche Auflösung Faktoren berechnen?! Und wie lautet der Befehl, um die berechnete Skallierung dann wieder einzusetzen?!
Also das mit ScrnSize = get(0,'ScreenSize') hab ich auch schon versucht, aber sobald ich das Programm in einer anderen Auflösung ausführe, holt sich Matlab trotzdem die ursprüngliche Auflösung, in der ich programmiert habe...
Das verstehe ich nicht, bitte poste was du versucht hast. Und wo bei dir überall die Position verändert wird?
Also ich versuche jetzt mit diesem Befehl die aktuell eingestellte Auflösung des Bildschirms zu bekommen, richtig? Habe das GUI mit einer Bildschirmauflösung von 1366 x 768 programmiert... Dann habe ich die Auflösung auf 800 x 600 heruntergeschraubt, um zu testen, ob Matlab mir jetzt die "neue" Auflösung anzeigt, aber er gibt mir nach wie vor die vorherige Auflösung an.
Also egal welche Auflösung ich einstelle, er gibt mir immer folgendes aus:
hier mal der Code, welches in die OpenningFcn eingebaut werden soll
Code:
% Bildschirmauflösung, unter die GUI entstand:
develop_screen_size = [1280720] % Aktuelle Auflösung abfragen:
current_screen_size = get(0,'ScreenSize')
% Faktoren für die Änderung zw. Auflösungen berechnen
fctr_w = current_screen_size(3)/develop_screen_size(1);
fctr_h = current_screen_size(4)/develop_screen_size(2);
%
% Die aktuelle Größe des Fensters abfragen:
figsize = get(handles.figure, 'Position');
% setze die Fenstergröße zurück, % falls units auf normalized gesetzt sind ifall(figsize <= 1)
figsize (:,[1,3]) = figsize (:,[1,3])/fctr_w;
figsize (:,[2,4]) = figsize (:,[2,4])/fctr_h;
end
% danach minimalen Faktor auswählen und % nach dem beide Seiten skalieren
fctr = min(fctr_w,fctr_h);
figsize (:,[1,3]) = figsize (:,[1,3])*(fctr);
figsize (:,[2,4]) = figsize (:,[2,4])*(fctr);
% falls unit nicht normalized sind, runden ifany(figsize > 1)
figsize =round(figsize);
end
verändere die Fenstergröße
set(handles.figure,'Position',figsize)
Eine Frage hätte ich da noch... Hab das Prinzip auch soweit verstanden, aber jetzt besteht mein Problem in der Umsetzung!
Muss ich diesen ganzen Code jetzt für jedes Objekt (also jedes Textfeld, jedes Diagramm, usw.) einzeld durchlaufen lassen, oder gibt es eine Möglichkeit quasi das ganze Programm komplett so zu skalieren?!
Ich habs mit get(handles.Programmname,'Position') versucht, aber das funktioniert nicht! Da sagt er mir immer:
"Reference to a cleared variable handles"
Da muss es doch noch einen einfacheren Weg geben, quasi alle Objekte gemeinsam zu bearbeiten?!
für die anderen GUI-Elemente sollten Units auf normalized stehen, dann passen sich diese automatisch der GUI-Auflösung an.
Der Code sollte in der OpeningFcn ausgeführt werden.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.