WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

GUI in verschiedenen Auflösungen ausführen

 

Turbopavel
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 22.11.12
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 22.11.2012, 13:17     Titel: GUI in verschiedenen Auflösungen ausführen
  Antworten mit Zitat      
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! Rolling Eyes

Danke schonmal für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.11.2012, 15:11     Titel: Re: GUI in verschiedenen Auflösungen ausführen
  Antworten mit Zitat      
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 22.11.2012, 17:18     Titel:
  Antworten mit Zitat      
Hallo

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Turbopavel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 22.11.12
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 23.11.2012, 09:30     Titel:
  Antworten mit Zitat      
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?!

Danke schonmal für eure Hilfe(n)! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.11.2012, 10:41     Titel:
  Antworten mit Zitat      
Turbopavel hat Folgendes geschrieben:
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
Turbopavel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 22.11.12
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 23.11.2012, 14:32     Titel:
  Antworten mit Zitat      
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:

ScrnSize = [1 1 1366 768]
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.11.2012, 14:44     Titel:
  Antworten mit Zitat      
Hallo

wenn du die Auflösung deines Bildschirms änderst, dann muss Matlab danach neu gestartet werden. Damit Matlab diese Veränderung mitbekommt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Turbopavel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 22.11.12
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 23.11.2012, 14:59     Titel:
  Antworten mit Zitat      
Oh, alles klar! Da hätte ich ja noch lange probieren können! Laughing

Kannst du mir noch etwas ausführlicher beschreiben, wie ich jetzt weiter verfahren muss?!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 24.11.2012, 08:28     Titel:
  Antworten mit Zitat      
Hallo

Also habe schon das Verfahren oben beschrieben,

hier mal der Code, welches in die OpenningFcn eingebaut werden soll
Code:

% Bildschirmauflösung, unter die GUI entstand:
develop_screen_size = [1280 720]
% 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
if all(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
if any(figsize > 1)
  figsize =round(figsize);
end

verändere die Fenstergröße
set(handles.figure,'Position',figsize)





 


Zuletzt bearbeitet von denny am 28.11.2012, 14:58, insgesamt 3-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Turbopavel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 22.11.12
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 28.11.2012, 08:43     Titel:
  Antworten mit Zitat      
Hey! Super!!! Vielen vielen Dank, das is genau das, wonach ich gesucht haben...
Private Nachricht senden Benutzer-Profile anzeigen
 
Turbopavel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 22.11.12
Wohnort: ---
Version: R2017a
     Beitrag Verfasst am: 18.01.2013, 19:38     Titel:
  Antworten mit Zitat      
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?!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.01.2013, 20:49     Titel:
  Antworten mit Zitat      
Hallo

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.