2016-06-08 78 views
5

Mi muovo da un sito aziendale a un altro. In un dato giorno, potrei avere solo il mio laptop o almeno quattro monitor. Con più monitor, non so quale monitor sceglierò di utilizzare per la GUI principale di MATLAB (la GUI principale lanciata quando si fa doppio clic su matlab.exe). Dipende dalle risoluzioni dei monitor disponibili.Determina il monitor di MATLAB in una configurazione a più monitor

Io uso script che utilizzano GUI generate a livello di codice (non da GUIDE) e sembra che MATLAB le faccia apparire sempre sul primo monitor. Ho ricercato un po 'e ho trovato per localizzare le GUI su un monitor di scelta usando il comando p = get(gcf, 'Position'), set(0, 'DefaultFigurePosition', p) e movegui, ma questo funzionerà solo se so in anticipo quale monitor voglio usare.

C'è un modo per scoprire su quale monitor la GUI MATLAB principale è attiva e sono presenti altre GUI piccole sullo stesso monitor?

risposta

4

Possiamo utilizzare alcuni trucchi Java per ottenere il monitor corrente; vedi codice con commenti qui sotto:

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 

alcune note:

  • Root properties documentation.
  • Un valore di uscita di "0" significa che qualcosa non va.
  • Potrebbe esserci un modo più semplice per ottenere il "RootPane"; Ho usato un metodo con cui ho una buona esperienza.
  • Questo riconosce solo uno dei monitor nel caso in cui la finestra MATLAB si estenda su più monitor. Se questa funzionalità è richiesta, puoi usare com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor.getComponent.getRootPane.getWidth ecc. Per trovare gli altri angoli della finestra MATLAB e fare lo stesso test con loro.
  • Non mi sono preoccupato di interrompere il ciclo dopo aver rilevato il primo monitor valido poiché si presume che: 1) Solo un monitor è valido. 2) La quantità totale di monitor che il ciclo dovrà elaborare è piccola.
  • Per i più coraggiosi, è possibile eseguire un controllo con poligoni (ad esempio inpolygon).