5

Я часто перемещаюсь с сайта компании на другой. В любой день у меня может быть только мой ноутбук или целых четыре монитора. С несколькими мониторами я не знаю, какой монитор я буду использовать для основного графического интерфейса MATLAB (основной графический интерфейс запускается при двойном щелчке matlab.exe). Это зависит от разрешений доступных мониторов.Определение монитора MATLAB в конфигурации с несколькими мониторами

Я использую скрипты, которые используют программно сгенерированные графические интерфейсы (а не GUIDE), и кажется, что MATLAB всегда всплывает на первом мониторе. Я немного поработал и нашел, чтобы найти графические интерфейсы на выбранном мониторе, используя команды p = get(gcf, 'Position'), set(0, 'DefaultFigurePosition', p) и movegui, но это будет работать, только если я заранее знаю, какой монитор я хочу использовать.

Есть ли способ узнать, на каком мониторе находится главный графический интерфейс MATLAB, и появляются другие маленькие графические интерфейсы на одном мониторе?

ответ

4

Мы можем использовать некоторые трюки Java для получения текущего монитора; см код с комментариями ниже:

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 

Несколько замечаний:

  • Root properties documentation.
  • Выходное значение «0» означает, что что-то не так.
  • Возможно, есть более простой способ получить «RootPane»; Я использовал метод, с которым у меня есть хороший опыт.
  • Это признает только один из мониторов, если ваше окно MATLAB охватывает несколько мониторов. Если требуется эта функция, вы можете использовать com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor.getComponent.getRootPane.getWidth и т. Д., Чтобы найти другие углы окна MATLAB и выполнить с ними те же тесты.
  • Я не беспокоился о выходе из цикла после того, как был найден первый действительный монитор, так как предполагается, что: 1) Действует только один монитор. 2) Общее количество мониторов, которые цикл должен обрабатывать, невелико.
  • Для храбрых можно выполнить проверку полигонами (то есть inpolygon).

 Смежные вопросы

  • Нет связанных вопросов^_^