6

会社のサイトから別のサイトに頻繁に移動します。いつでも、ラップトップだけか、4 台のモニターしか持っていない場合があります。複数のモニターがある場合、MATLAB メイン GUI (matlab.exe をダブルクリックすると起動するメイン GUI) にどのモニターを使用するかわかりません。使用可能なモニターの解像度によって異なります。

(GUIDE ではなく) プログラムで生成された GUI を利用するスクリプトを使用していますが、MATLAB は常に最初のモニターにポップアップするようです。少し調べたところp = get(gcf, 'Position')、 、set(0, 'DefaultFigurePosition', p)、およびmoveguiコマンドを使用して選択したモニターに GUI を配置できることがわかりましたが、これは、使用するモニターを事前に知っている場合にのみ機能します。

メインの MATLAB GUI が起動しているモニターを見つけて、他の小さな GUI を同じモニターにポップアップさせる方法はありますか?

4

2 に答える 2

5

いくつかの 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

いくつかのメモ:

  • ルート プロパティのドキュメント
  • 出力値「0」は、何かがおかしいことを意味します。
  • 「RootPane」を取得する簡単な方法があるかもしれません。私は経験豊富な方法を使用しました。
  • MATLAB ウィンドウが複数のモニターにまたがる場合、これはモニターの 1 つだけを認識します。この機能が必要な場合は、com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor.getComponent.getRootPane.getWidthetc を使用して MATLAB ウィンドウの他のコーナーを見つけ、それらで同じテストを行うことができます。
  • 最初の有効なモニターが見つかった後、ループから抜け出すことは気にしませんでした。これは、次のことが想定されているためです。1)有効なモニターは 1 つだけです。2)ループが処理しなければならないモニターの全体量が少ない。
  • 勇敢な人は、ポリゴンでチェックを実行できます(つまりinpolygon)。
于 2016-06-08T16:55:46.947 に答える
0

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
于 2018-12-24T15:20:55.627 に答える