2016-06-08 40 views
5

Ich bewege mich viel von einer Firmenseite zur nächsten. An jedem beliebigen Tag habe ich vielleicht nur meinen Laptop oder bis zu vier Monitore. Bei mehreren Monitoren weiß ich nicht, welchen Monitor ich für die MATLAB Haupt-GUI verwenden werde (die Haupt-GUI wird gestartet, wenn Sie auf Matlab.exe doppelklicken). Das hängt von den Auflösungen der verfügbaren Monitore ab.Ermitteln Sie den Monitor von MATLAB in einer Konfiguration mit mehreren Monitoren.

Ich benutze Skripte, die programmgesteuert generierte GUIs verwenden (nicht von GUIDE) und es scheint, dass MATLAB sie immer auf dem ersten Monitor erscheint. Ich habe ein bisschen recherchiert und gefunden, um die GUIs zu einem Monitor der Wahl zu lokalisieren, indem Sie p = get(gcf, 'Position'), set(0, 'DefaultFigurePosition', p) und movegui Befehl verwenden, aber dies wird nur funktionieren, wenn ich im Voraus weiß, welchen Monitor ich verwenden möchte.

Gibt es eine Möglichkeit herauszufinden, auf welchem ​​Monitor die Hauptoberfläche von MATLAB läuft und andere kleine GUIs auf demselben Monitor erscheinen?

Antwort

4

Wir können einige Java-Tricks verwenden, um den aktuellen Monitor zu erhalten; siehe Code mit Kommentaren unten:

function mon = q37705169 
%% Get monitor list: 
monitors = get(groot,'MonitorPositions'); % also get(0,'MonitorPositions'); 
%% Get the position of the main MATLAB screen: 
pt = com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor.getComponent.getRootPane.getLocationOnScreen; 
matlabScreenPos = [pt.x pt.y]+1; % "+1" is to shift origin for "pixel" units. 
%% Find the screen in which matlabScreenPos falls: 
mon = 0; 
nMons = size(monitors,1); 
if nMons == 1 
    mon = 1; 
else 
    for ind1 = 1:nMons  
    mon = mon + ind1*(... 
     matlabScreenPos(1) >= monitors(ind1,1) && matlabScreenPos(1) < sum(monitors(ind1,[1 3])) && ... 
     matlabScreenPos(2) >= monitors(ind1,2) && matlabScreenPos(2) < sum(monitors(ind1,[2 4]))); 
    end 
end 

Ein paar Hinweise:

  • Root properties documentation.
  • Ein Ausgabewert von "0" bedeutet, dass etwas nicht stimmt.
  • Es kann einen einfacheren Weg geben, die "RootPane" zu bekommen; Ich habe eine Methode benutzt, mit der ich gute Erfahrungen gemacht habe.
  • Dies erkennt nur einen der Monitore, falls Ihr MATLAB-Fenster mehrere Monitore überspannt. Wenn diese Funktionalität benötigt wird, können Sie com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor.getComponent.getRootPane.getWidth usw. verwenden, um die anderen Ecken des MATLAB-Fensters zu finden und denselben Test mit ihnen durchzuführen.
  • Ich habe mich nicht darum gekümmert, die Schleife zu verlassen, nachdem der erste gültige Monitor gefunden wurde, da angenommen wird: 1) Nur ein Monitor ist gültig. 2) Die Gesamtanzahl der Monitore, die die Schleife verarbeiten muss, ist gering.
  • Für die Mutigen kann man einen Check mit Polygonen durchführen (d. H. inpolygon).