2016-06-08 35 views
5

Bir şirket sitesinden diğerine çok hareket ediyorum. Herhangi bir günde, sadece dizüstü bilgisayarım veya dört monitör kadar olabilir. Birden fazla monitörle, MATLAB ana GUI (matlab.exe'yi çift tıklattığınızda başlatılan ana GUI) için hangi monitörü kullanmayı seçeceğimi bilmiyorum. Mevcut monitörlerin çözünürlüklerine bağlıdır.MATLAB Monitörünü çoklu monitör yapılandırmasında belirleme

Program aracılığıyla oluşturulmuş GUI'leri (GUIDE ile değil) kullanan komut dosyaları kullanıyorum ve MATLAB'ın her zaman ilk monitörde açıldığı görülüyor. Biraz araştırma yaptım ve GUI'leri p = get(gcf, 'Position'), set(0, 'DefaultFigurePosition', p) ve movegui komutunu kullanarak bir monitör seçimini bulmaya çalıştım, ancak bu yalnızca hangi monitörü kullanmak istediğimi önceden biliyorsam çalışacaktır.

Ana MATLAB GUI'nin hangi monitörde kaldığını ve aynı monitörde başka küçük GUI'lerin görüntülenmesini sağlamanın bir yolu var mı?

cevap

4

Mevcut monitörü almak için bazı Java püf noktalarını kullanabiliriz; Aşağıdaki yorumlarla kodu bakın:

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 

Birkaç notlar:

  • Root properties documentation.
  • "0" bir çıktı değeri, bir şeyin yanlış olduğu anlamına gelir.
  • "RootPane" öğesini almanın daha kolay bir yolu olabilir; İyi bir deneyime sahip olduğum bir yöntem kullandım.
  • Bu, yalnızca MATLAB pencerenizin birkaç monitörü kapsaması durumunda monitörlerden birini tanıyacaktır. Bu işlevsellik gerekiyorsa MATLAB penceresinin diğer köşelerini bulmak için com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor.getComponent.getRootPane.getWidth vb. Kullanabilirsiniz ve aynı testi bunlarla yapın.
  • İlk geçerli izleyici bulunduğundan beri döngüden ayrılma zahmetine girmedim: 1) Yalnızca bir monitör geçerli. 2) Döngünün işlenmesi gereken toplam monitör miktarı küçüktür.
  • Cesurluk için, çokgenlerle (yani, inpolygon) bir kontrol gerçekleştirilebilir.