我经常从一个公司地点搬到另一个公司地点。在任何一天,我可能只有我的笔记本电脑或多达四台显示器。对于多个显示器,我不知道将选择哪个显示器用于 MATLAB 主 GUI(双击 matlab.exe 时启动的主 GUI)。这取决于可用显示器的分辨率。
我使用的脚本利用以编程方式生成的 GUI(不是通过 GUIDE),并且 MATLAB 似乎总是在第一个监视器上弹出它们。我进行了一些研究,发现可以使用
p = get(gcf, 'Position')
、set(0, 'DefaultFigurePosition', p)
和 movegui
命令将 GUI 定位到所选显示器,但这只有在我事先知道要使用哪个显示器时才有效。
有没有办法找出主 MATLAB GUI 出现在哪个显示器上,并在同一显示器上弹出其他小 GUI?
我们可以使用一些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
一些注意事项:
com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor.getComponent.getRootPane.getWidth
等找到 MATLAB 窗口的其他角并对它们进行相同的测试。inpolygon
)。Thnx Dev-iL,工作得几乎完美,我添加了一些边距,以便在稍微偏离屏幕时“捕捉”窗口,或者根据我的经验,只是最大化。 发布我的编辑:
function mon = getMatlabMainScreen()
%% 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
marginLimit = 100;
margin =0;
while ~mon
for ind1 = 1:nMons
mon = mon + ind1*(...
matlabScreenPos(1) + margin >= monitors(ind1,1) && matlabScreenPos(1) < sum(monitors(ind1,[1 3])) + margin && ...
matlabScreenPos(2) + margin >= monitors(ind1,2) && matlabScreenPos(2) < sum(monitors(ind1,[2 4])) + margin );
end
margin = margin + 1;
if margin > marginLimit
break;
end
end
end