ドキュメンテーション センター

  • 評価版
  • 製品アップデート

このページは前リリースの情報です。該当の英語のページはこのリリースで更新されています。このリリースの英語のドキュメンテーションを参照するには、言語設定を United States に変更してください。

複数の GUI を連携して動作させる方法

データを共有する方法

GUI 内でデータを共有するために GUI のコールバック間でデータを共有する例 で述べた手法のいくつかにより、複数の GUI 間でデータを共有することもできます。最初の GUI のオブジェクトに対するハンドルが、他の GUI に対しても利用可能である限り、GUI 間でやりとりするために、GUI データ、アプリケーション データ、UserData プロパティを使用できます。ここでは、以下の手法を説明する例を 2 つ提供します。

    メモ:   以下の例では、データを共有する手法を簡潔に伝えるために、コード部分を省略します。省略は、省略記号で表されます。

    .
    .
    .

    完全な GUI コード ファイルや FIG ファイルをコピー、実行、表示、変更すれば、省略のない例を見ることができます。

例: ユーザーの入力に対するモーダル ダイアログ ボックスの取り扱い

この例では、複数の GUI を共に動作させる際に呼び出される共通のタスクを行う方法を説明します。メイン GUI に対して 第 2 の GUI を配置する方法を説明し、GUIDE GUI から呼び出されたモーダル ダイアログ ボックスにデータがどのように渡されるかを説明します。ダイアログ ボックスは、エディット フィールドにテキスト データを表示します。ユーザーがエディット フィールドに行った変更は、メイン GUI に戻されます。メイン GUI は、このデータを様々な方法で使用します。モーダル ダイアログ ボックスのデータを変更すると、メイン GUI のコンポーネントの 1 つの外見を更新できます。

メイン GUI、changeme_main は、1 つのボタンと説明を与えるスタティック テキスト フィールドを含みます。ボタンをクリックすると、モーダル ダイアログ ボックス changeme_dialog が開き、ボタンの現在の文字列が編集可能なテキスト フィールドに現れ、ユーザーによる変更が可能になります。

[OK] をクリックすると、テキスト フィールドの値はメイン GUI に返されます。これは、ボタンの文字列のプロパティを入力した値に設定します。メイン GUI とそのモーダル ダイアログ ボックスを、次の図に示します。

    メモ:   changeme_dialog の GUI は、同じ目的をもつ定義済みダイアログ ボックスである、MATLAB の関数 inputdlg にならって作成されています。これは、GUI と他のプロセスの呼び出しをブロックするために uiwait も呼び出します。プログラムにより GUI を作成すると、inputdlg を使用できます。

changeme の GUI の表示および実行

この例の GUI ファイルのコピーを取得して表示し、GUI を実行するには、以下の手順に従います。

  1. 書き込みアクセス権限のあるフォルダーに現在のフォルダーを設定します。

  2. 以下のコマンドを実行して、サンプル コードをコピーします。

    copyfile(fullfile(docroot, 'techdoc','creating_guis','examples'...
      ,'changeme*.*')),fileattrib('changeme*.*', '+w');
    
  3. 以下のコマンドを実行して、この例を 2 つの GUIDE レイアウト エディターに表示します。

    guide changeme_main
    guide changeme_dialog
  4. 両方のレイアウト エディターで [エディター] ボタン をクリックして、コードをエディターで表示します。

  5. changeme_main GUI のレイアウト エディターで [Figure を実行] ボタン をクリックして、GUI を実行します。

  6. 実行中の GUI で閉じるボタン をクリックして GUI を閉じます。

レイアウト エディターで任意のコンポーネントをダブルクリックしてプロパティ インスペクターを開くと、そのコンポーネントのプロパティを表示できます。Figure、コード、またはその両方を変更することができます。次に、GUIDE で [ファイル][名前を付けて保存] を選択して、現在のフォルダーに GUI を保存します。これにより、両方のファイルが保存されます。名前を変更することもできます。

    メモ:   GUI ファイルを元の examples フォルダーに保存すると、元のファイルが上書きされてしまいます。GUI ファイルを保存する場合は、GUIDE で [ファイル][名前を付けて保存] を選択します。これにより、GUI FIG ファイルと GUI コード ファイルの両方が保存されます。

[Text Change] ダイアログ ボックスの起動

[Change Me] ボタンをクリックすると、[Text Change] ダイアログ ボックスが開きます。プロパティ/値の組を用いてそのメイン関数を呼び出すことで、このダイアログ ボックスを起動します。

  • 名前:'changeme_main' (メイン GUI の名前)

  • 値:メイン GUI の Figure ハンドル

function buttonChangeMe_Callback(hObject,eventdata, handles)

% Call the dialog to change button name giving this figure's handle
changeme_dialog('changeme_main', handles.figure);

ダイアログ ボックスは、メイン GUI のデータにアクセスするためにハンドルを使用します。メイン GUI のデータがない場合、ダイアログ ボックスはコマンド ウィンドウに適切な使用方法を示すエラーを表示してから終了します。

[Text Change] ダイアログの管理

  1. [Text Change] ダイアログ ボックスの Figure に対するプロパティ インスペクターにおいて、WindowStyle プロパティを 'Modal' に設定します。これにより、ダイアログ ボックスがアクティブであるとき、ユーザーは他の Figure とやりとりすることができません。

  2. uiresume が呼び出されるまで、output 関数の呼び出しを延期するために、ダイアログ ボックスの OpeningFcnuiwait を呼び出します。これによって、そのときまで GUI の起動の呼び出しが返らないようにすることができます。

    function changeme_dialog_OpeningFcn(hObject,eventdata,handles,varargin)
    .
    .
    .
    uiwait(hObject);
    .
    .
    .
    
  3. Figure に対する CloseRequestFcn 内の uiresume[Cancel] ボタン、および [OK] ボタンを呼び出します。GUI を閉じるコールバックは、それぞれ uiresume を呼び出す必要があります。

    function buttonCancel_Callback(hObject,eventdata,handles)
    
    uiresume(handles.figure);
    
    
    function figure_CloseRequestFcn(hObject,eventdata,handles)
    
    uiresume(hObject);
    
    
    function buttonOK_Callback(hObject,eventdata,handles)
    .
    .
    .
    uiresume(handles.figure);

[Text Change] ダイアログの保護と位置決め

  1. ユーザーは、メイン GUI の buttonChangeMe_Callback コールバックをトリガーすることで、 [Text Change] ダイアログ ボックスを開きます。このコールバックは、メイン GUI の Figure ハンドルを changeme_main と呼ばれるプロパティとして提供します。

  2. ダイアログ ボックスに対する OpeningFcn は、varagin セル配列を検索し、インデックスを付けることで入力を有効にします。'changeme_main' とハンドルが連続する引数として見つけられると、それは uiwait を呼び出します。これにより、ダイアログ GUI は、OutputFcn が Figure を閉じるのを待たずに終了できます。これがプロパティを見つけない、または無効な値を見つけると、モーダル ダイアログ ボックスがエラーを表示して終了します。

    function changeme_dialog_OpeningFcn(hObject, ...
             eventdata, handles, varargin)
    
    % Is the changeme_main gui's handle is passed in varargin?
    % if the name 'changeme_main' is found, and the next argument
    % varargin{mainGuiInput+1} is a handle, assume we can open it.
    
    dontOpen = false;
    mainGuiInput = find(strcmp(varargin, 'changeme_main'));
    if (isempty(mainGuiInput)) 
      || (length(varargin) <= mainGuiInput) 
      || (~ishandle(varargin{mainGuiInput+1}))
        dontOpen = true;
    else
    .
    .
    .
    end
    .
    .
    .
    if dontOpen
       disp('-----------------------------------------------------');
       disp('Improper input arguments. Pass a property value pair’) 
       disp('whose name is "changeme_main" and value is the handle’)
       disp('to the changeme_main figure.');
       disp('eg:');
       disp('   x = changeme_main()');
       disp('   changeme_dialog('changeme_main', x)');
       disp('-----------------------------------------------------');
    else
       uiwait(hObject);
    end
  3. その Figure に渡されたハンドルを利用して、changeme_dialog_OpeningFcn はメイン GUI の中央に [Text Change] ダイアログ ボックスを置きます。そのため、メイン Figure が移動されてダイアログ ボックスが起動すると、これは常に固定した位置ではなく、相対的に同じ位置に開きます。

    function changeme_dialog_OpeningFcn(hObject, ...
             eventdata, handles, varargin)
    .
    .
    .  
    mainGuiInput = find(strcmp(varargin, 'changeme_main'));
    .
    .
    .
    handles.changeMeMain = varargin{mainGuiInput+1};
    .
    .
    .
    % Position to be relative to parent:
    parentPosition = getpixelposition(handles.changeMeMain);
    currentPosition = get(hObject, 'Position');  
    % Sets the position to be directly centered on the main figure
    newX = parentPosition(1) + (parentPosition(3)/2 ...
           - currentPosition(3)/2);
    newY = parentPosition(2) + (parentPosition(4)/2 ...
           - currentPosition(4)/2);
    newW = currentPosition(3);
    newH = currentPosition(4);
    
    set(hObject, 'Position', [newX, newY, newW, newH]);
    .
    .
    .

[Text Change] ダイアログ ボックスのテキストの初期化

  1. [Text Change] ダイアログ ボックスのテキストを [Change Me] ボタンの現在のテキストに初期化するには、メインの GUI の handles 構造体を、モーダル ダイアログ ボックスに渡したそのハンドルから取得します。

    function changeme_dialog_OpeningFcn(hObject, ...
             eventdata, handles, varargin)
    
    mainGuiInput = find(strcmp(varargin, 'changeme_main'));
    .
    .
    .
    handles.changeMeMain = varargin{mainGuiInput+1};
  2. [Change Me] ボタンの String プロパティを取得し、エディット ボックスの String プロパティを、ダイアログ ボックス OpeningFcn の値に設定します。

        % Obtain handles using GUIDATA with the caller's handle 
        mainHandles = guidata(handles.changeMeMain);
        % Set the edit text to the String of the main GUI's button
        set(handles.editChangeMe, 'String', ...
            get(mainHandles.buttonChangeMe, 'String'));
    .
    .
    .

[Text Change] ダイアログ ボックスのキャンセル

[キャンセル] をクリックするか、あるいはウィンドウを閉じると、uiresume を呼び出してモーダル ダイアログ ボックスを閉じます。モーダル ダイアログ ボックスを閉じるために、メイン GUI を変更しないでください。

function buttonCancel_Callback(hObject, ...
         eventdata, handles)
uiresume(handles.figure);
 
function figure_CloseRequestFcn(hObject, ...
         eventdata, handles)
uiresume(hObject);

テキスト変更の適用

テキストに変更を適用するには、モーダル ダイアログ ボックスの OpeningFcn に保存された handles 構造体のメイン GUI への参照を使用します。[OK] をクリックすると、テキストの変更が適用されます。これにより、メイン GUI の [Change Me] ボタン ラベルが、モーダル ダイアログ ボックスのテキスト フィールドに入力された値に設定されます。

function buttonOK_Callback(hObject, ...
         eventdata, handles)
text = get(handles.editChangeMe, 'String');
main = handles.changeMeMain;
mainHandles = guidata(main);
changeMeButton = mainHandles.buttonChangeMe;
set(changeMeButton, 'String', text);
uiresume(handles.figure);

メイン GUI を閉じる

ユーザーが changeme_dialog GUI を閉じると、changeme_main GUI は待ち状態になります。ユーザーは、名前を再び変更するためにプッシュ ボタンをクリックするか、または [X] クローズ ボックスをクリックして GUI を閉じることができます。ユーザーが GUI を閉じると、GUI の Figure を削除する前にその OutputFcn はプッシュ ボタンの現在のラベル (その String プロパティ) を返します。

function varargout = changeme_dialog_Dialog_OutputFcn...
			             (hObject, eventdata, handles)
% Get pushbutton string from handles structure and output it
varargout{1} = get(handles.buttonChangeMe,'String');
% Now destroy yourself
delete(hObject);

CloseRequestFcn も必要になります。これを指定しないと、既定値の CloseRequestFcn、MATLAB 関数 closreq は、任意の OutputFcn が呼び出しできる前に Figure を直ちに削除するので、GUI はデータを出力できません。この figure_CloseRequestFcn はそれを行いますが、GUI が待ち状態にない場合に限ります。GUI が待ち状態にあるときには、GUI は uiresume を呼び出し、返ります。OutputFcn を呼び出し可能にします。

function figure_CloseRequestFcn(hObject,eventdata,handles)
% hObject    handle to figure (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Check appdata flag to see if the main GUI is in a wait state
if getappdata(handles.figure,'waiting')
    % The GUI is still in UIWAIT, so call UIRESUME and return
    uiresume(hObject);
    setappdata(handles.figure,'waiting',0)
else
    % The GUI is no longer waiting, so destroy it now.
    delete(hObject);
end

例: アイコン操作ツールとして協同している個々の GUIDE GUI

この例は、メイン GUI から起動されたときに、GUIDE の 3 つの GUI がどのようにともに動作するかを示しています。ツールが下記にリストされて説明されています。

  • 描画エリア (アイコン エディター)

  • ツール選択ツール バー (ツール パレット)

  • 色の選択 (カラー パレット)

これらの GUI はデータを共有し、いくつかの異なる手法を利用してそれぞれに対して機能します。

3 つのアイコンを操作する GUI の表示および実行

この例の GUI ファイルのコピーを取得して表示し、GUI を実行するには、以下の手順に従います。

  1. 書き込みアクセス権限のあるフォルダーに現在のフォルダーを設定します。

  2. 以下のコマンドを実行して、サンプル コードをコピーします。

    copyfile(fullfile(docroot, 'techdoc','creating_guis',...
      'examples','guide*.*')),...
       fileattrib('guide*.*', '+w');
    
  3. 以下の MATLAB® コマンドを実行して、この例を 3 つの GUIDE レイアウト エディターに表示します。

    guide guide_iconeditor; 
    guide guide_toolpalette; 
    guide guide_colorpalette
  4. 各レイアウト エディターで [エディター] ボタン をクリックして、コードをエディターで表示します。

  5. guide_iconeditor GUI のレイアウト エディターで [Figure を実行] ボタン をクリックして、GUI を実行します。

  6. 実行中の GUI で閉じるボタン をクリックして GUI を閉じます。

レイアウト エディターで任意のコンポーネントをダブルクリックしてプロパティ インスペクターを開くと、そのコンポーネントのプロパティを表示できます。Figure、コード、またはその両方を変更することができます。次に、GUIDE で [ファイル][名前を付けて保存] を選択して、現在のフォルダーに GUI を保存します。これにより、両方のファイルが保存されます。名前を変更することもできます。

    メモ:   GUI ファイルを元の examples フォルダーに保存すると、元のファイルが上書きされてしまいます。GUI ファイルを保存する場合は、GUIDE で [ファイル][名前を付けて保存] を選択します。これにより、GUI FIG ファイルと GUI コード ファイルの両方が保存されます。

次の順序で、アイコン エディター アプリケーションの動作を説明します。

アイコン エディターの実装

アイコン エディター アプリケーションでは、GUIDE に完全に実装されている 3 つのコード ファイルと 3 つの FIG ファイルを使用します。GUIDE 環境でそれらを変更したり、改善するように、ユーザーは選択できます。ファイルは、以下のとおりです。

  • guide_iconeditor.figguide_iconeditor.m: アイコン ファイルを描いたり、変更するためのメイン GUI

  • guide_colorpalette.figguide_colorpalette.m: 現在の色を選択するパレット

  • guide_toolpalette.figguide_toolpalette.m: 4 つの編集ツールを選択するためのパレット

コード ファイルには、以下の関数のシグネチャと出力 (該当する場合) が含まれます。

  • guide_iconeditor.m

    varargout = guide_iconeditor(varargin)
    guide_iconeditor_OpeningFcn(hObject, eventdata, handles, varargin)
    varargout = guide_iconeditor_OutputFcn(hObject, eventdata, handles)
    editFilename_CreateFcn(hObject, eventdata, handles)
    buttonImport_Callback(hObject, eventdata, handles)
    buttonOK_Callback(hObject, eventdata, handles
    buttonCancel_Callback(hObject, eventdata, handles)
    editFilename_ButtonDownFcn(hObject, eventdata, handles)
    editFilename_Callback(hObject, eventdata, handles)
    figure_CloseRequestFcn(hObject, eventdata, handles)
    figure_WindowButtonDownFcn(hObject, eventdata, handles)
    figure_WindowButtonUpFcn(hObject, eventdata, handles)
    figure_WindowButtonMotionFcn(hObject, eventdata, handles)
    [toolPalette, toolPaletteHandles]= getToolPalette(handles)
    [colorPalette, colorPaletteHandles] = getColorPalette(handles)
    setColor(hObject, color)
    color = getColor(hObject)
    updateCursor(hObject, overicon)
    applyCurrentTool(handles)
    localUpdateIconPlot(handles)
    cdwithnan = localGetIconCDataWithNaNs(handles)
    
  • guide_colorpalette.m

    varargout = guide_colorpalette(varargin)
    guide_colorpalette_OpeningFcn(hObject, eventdata, handles, varargin)
    varargout = guide_colorpalette_OutputFcn(hObject, eventdata, handles)
    buttonMoreColors_Callback(hObject, eventdata, handles)
    colorCellCallback(hObject, eventdata, handles)
    figure_CloseRequestFcn(hObject, eventdata, handles)
    localUpdateColor(handles)
    setSelectedColor(hObject, color)
    
  • guide_toolPalatte.m

    varargout = guide_toolpalette(varargin)
    guide_toolpalette_OpeningFcn(hObject, eventdata, handles, varargin)
    varargout = guide_toolpalette_OutputFcn(hObject, eventdata, handles)
    toolPencil_CreateFcn(hObject, eventdata, handles)
    toolEraser_CreateFcn(hObject, eventdata, handles)
    toolBucket_CreateFcn(hObject, eventdata, handles)
    toolPicker_CreateFcn(hObject, eventdata, handles)
    toolPalette_SelectionChangeFcn(hObject, eventdata, handles)
    figure_CloseRequestFcn(hObject, eventdata, handles)
    [iconEditor, iconEditorHandles] = getIconEditor(handles)
    cdata = pencilToolCallback(handles, toolstruct, cdata, point)
    cdata = eraserToolCallback(handles, toolstruct, cdata, point)
    cdata = bucketToolCallback(handles, toolstruct, cdata, point)
    cdata = fillWithColor(cdata, rows, cols, color, row, col, seedcolor)
    cdata = colorpickerToolCallback(handles, toolstruct, cdata, point)
    
    

アイコン エディター、ツール パレット、カラー パレットを開く

アイコン エディターを開くと、ツール パレットとカラー パレットが自動的に起動します。パレットはアイコン エディターの子であり、以下に述べるようなやりとりを行います。

  • プロパティ/値の組: 入力引数として渡すことで、新規に起動または既存の GUI にデータを送ります。

  • GUI データ: GUI の handles 構造体にデータを格納します。1 つの GUI 内、または複数の GUI 間でデータをやりとりできます。

  • 出力: 起動された GUI からデータを出力します。起動された GUI の handles 構造体など、起動している GUI にデータを返し、データをやりとりするために使用されます。

アイコン エディターは、プロパティ/値の組として ツール パレットとカラー パレットに渡されます。これにより、ツールとカラー パレットはアイコン エディターにコールバックできます。両方のパレットを呼び出すと、それらの GUI の Figure のハンドルが出力値になります。これらの Figure ハンドルは、アイコン エディターの handles 構造体に保存されています。

% in Icon Editor
function guide_Icon Editor_OpeningFcn(hObject,eventdata,handles,varargin)
.
.
.
handles.colorPalette = guide_colorpalette('iconEditor',hObject);
handles.toolPalette  =  guide_toolpalette('iconEditor',hObject);
.
.
.
% Update handles structure
guidata(hObject, handles);

カラー パレットは、後で使用するためにアイコン エディターを記憶する必要があります。

% in colorPalette
function guide_colorpalette_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output = hObject;
.
.
.
handles.iconEditor = [];

iconEditorInput = find(strcmp(varargin, 'iconEditor'));
if ~isempty(iconEditorInput)
   handles.iconEditor = varargin{iconEditorInput+1};
end
.
.
.
% Update handles structure
guidata(hObject, handles);

ツール パレットも、アイコン エディターを記憶する必要があります。

% in toolPalette
function guide_toolpalette_OpeningFcn(hObject, ...
         eventdata, handles, varargin)
handles.output = hObject;
.
.
.
handles.iconEditor = [];

iconEditorInput = find(strcmp(varargin, 'iconEditor'));
if ~isempty(iconEditorInput)
   handles.iconEditor = varargin{iconEditorInput+1};
end
.
.
.
% Update handles structure
guidata(hObject, handles);

カラー パレットに初期の色を設定する

3 つの GUI すべてを作成後、 初期の色を設定する必要があります。アイコン エディターからカラー パレットを呼び出すと、カラー パレットは、アイコン エディターに初期の色の設定方法を伝える関数ハンドルを渡します。この関数ハンドルは、その handles 構造体に格納されます。カラー パレットがハンドルを出力する対象となる Figure から handles 構造体を取得できます。

% in colorPalette
function guide_colorpalette_OpeningFcn(hObject, ...
         eventdata, handles, varargin)
handles.output = hObject;
.
.
.
% Set the initial palette color to black
handles.mSelectedColor = [0 0 0];

% Publish the function setSelectedColor
handles.setColor = @setSelectedColor;
.
.
.
% Update handles structure
guidata(hObject, handles);


% in colorPalette
function setSelectedColor(hObject, color)
handles = guidata(hObject);
.
.
.
handles.mSelectedColor =color;
.
.
.
guidata(hObject, handles);

初期の色を 'red' に設定し、アイコン エディターから public 関数を呼び出します。

% in Icon Editor
function guide_iconeditor_OpeningFcn(hObject, ...
         eventdata, handles, varargin)
.
.
.
handles.colorPalette = guide_colorpalette('iconEditor', hObject);
.
.
.
colorPalette = handles.colorPalette;
colorPaletteHandles = guidata(colorPalette);
colorPaletteHandles.setColor(colorPalette, [1 0 0]);
.
.
.
% Update handles structure
guidata(hObject, handles);

アイコン エディターからカラー パレットの現在の色にアクセスする

カラー パレットは、現在のカラー データを初期化します。

%in colorPalette
function guide_colorpalette_OpeningFcn(hObject, ...
         eventdata, handles, varargin)
handles.output = hObject;
.
.
.
handles.mSelectedColor = [0 0 0];
.
.
.
% Update handles structure
guidata(hObject, handles);

アイコン エディターは、カラー パレットの GUI データから handles 構造体により初期の色を取得します。

% in Icon Editor
function color = getColor(hObject)
handles = guidata(hObject);
colorPalette = handles.colorPalette;
colorPaletteHandles = guidata(colorPalette);
color = colorPaletteHandles.mSelectedColor;

データを共有するために UserData プロパティを利用する

GUIDE GUI のコンポーネントの UserData プロパティを使用して、データを共有できます。アイコンの編集エリアでマウスをクリックして、ツールを選択します。ユーザーが編集しているアイコンを変更するために、ツールの CData を変更することで、ツール パレット内の各ツールを使用できます。GUI は、各ツールの UserData プロパティを使用して、ツールが選択され、アイコン編集エリアに適用されるときにユーザーが呼び出す関数を記録します。各ツールは、アイコン データの別の外見を変えます。鉛筆ツールの動作仕様の例を示します。

鉛筆ツールの CreateFcn において、鉛筆ツールの関数をポイントするユーザー データを追加します。

% in toolPalette
function toolPencil_CreateFcn(hObject, eventdata, handles)
set(hObject,'UserData', struct('Callback', @pencilToolCallback));

ツール パレットは、その handles 構造体の mCurrentTool フィールドで現在選択したツールをトラッキングします。ツール パレットの handles 構造体を作成後、他の GUI からこの構造体を取得できます。ツール パレットのボタンをクリックしてから guidata を呼び出すことによって、現在選択したツールを設定します。

% in toolPalette
function toolPalette_SelectionChangeFcn(hObject, ...
        eventdata, handles)
handles.mCurrentTool = hObject;
guidata(hObject, handles);

鉛筆ツールを選択してアイコン編集エリアをクリックすると、アイコン エディターが鉛筆ツール関数を呼び出します。

% in iconEditor
function iconEditor_WindowButtonDownFcn(hObject,...
         eventdata, handles)
toolPalette = handles.toolPalette;
toolPaletteHandles = guidata(toolPalette);
	.
	.
	.
userData = get(toolPaletteHandles.mCurrentTool, 'UserData');
handles.mIconCData = userData.Callback(toolPaletteHandles, ...
        toolPaletteHandles.mCurrentTool, handles.mIconCData, ...);

次のコードは、マウスでクリックされたアイコン編集エリアのピクセルの値 (ツール アイコンの CData) が、現在カラー パレットで選択されている色に変わる様子を示します。

% in toolPalette
function cdata = pencilToolCallback(handles, toolstruct, cdata,...)
iconEditor = handles.iconEditor;
iconEditorHandles = guidata(iconEditor);
x = ...
y = ...
% update color of the selected block
color = iconEditorHandles.getColor(iconEditor);
cdata(y, x,:) = color;

現在のツールのカーソルの表示

マウスが編集エリアにあり、既定の矢印が編集エリアの外側に表示される場合、カーソルに現在のツールのポインター アイコンを表示することができます。これを行うには、ツール パレットの handles 構造体により、選択されたツールを識別する必要があります。

% in Icon Editor
function iconEditor_WindowButtonMotionFcn(hObject, ...
        eventdata, handles)
.
.
.
rows = size(handles.mIconCData,1);
cols = size(handles.mIconCData,2);
pt = get(handles.icon,'currentpoint');
overicon = (pt(1,1)>=0 && pt(1,1)<=rows) && ...
           (pt(1,2)>=0 && pt(1,2)<=cols);
.
.
.
if ~overicon
    set(hObject,'pointer','arrow');        
else
    toolPalette = handles.toolPalette;
    toolPaletteHandles = guidata(toolPalette);
    tool = toolPaletteHandles.mCurrentTool;
    cdata = round(mean(get(tool, 'cdata'),3))+1;
    if ~isempty(cdata)
        set(hObject,'pointer','custom','PointerShapeCData', ...
        cdata(1:16, 1:16),'PointerShapeHotSpot',[16 1]);        
    end
end
.
.
.

終了するときにすべてのウィンドウを閉じる

アイコン エディターが開くと、handles 構造体に、ハンドルや他のデータを保存して、アイコン エディターはカラー パレットとツール パレットを開きます。アイコン エディターの OpeningFcn は、最後に uiwait を呼び出し、GUI が完成するまで出力を引き延ばします。ウィンドウを閉じる必要があると、一連の複雑なクローズ過程が含まれているので、カラー パレットもツール パレットもアイコン エディターを独立に閉じます。次のメソッドのいずれかを用いて、すべてのウィンドウを閉じることができます。

  • ツール パレットとカラー パレットの [OK] ボタンまたは [キャンセル] ボタンをクリックし、アイコン エディター ウィンドウを閉じる。

  • アイコン エディター ウィンドウを直接閉じる。

閉じるボタン ([X]) を直接クリックすることで、カラー パレットとツール パレットのウィンドウを閉じることはできません。

次の例では、アイコン エディターの出力を、アイコンの CData であると設定します。uiwait をもつアイコン エディターの opening 関数は、次のコードを含みます。

% in Icon Editor
function guide_iconeditor_OpeningFcn(hObject, eventdata, ...
        handles, varargin)

.
.
.
handles.colorPalette = guide_colorpalette();
handles.toolPalette = guide_toolpalette('iconEditor', hObject);
.
.
. 
% Update handles structure
guidata(hObject, handles);
uiwait(hObject);

結果として、各終了パスで uiresume を呼び出す必要があります。

% in Icon Editor
function buttonOK_Callback(hObject, eventdata, handles)
uiresume(handles.figure);

function buttonCancel_Callback(hObject, eventdata, handles)
% Make sure the return data will be empty if we cancelled
handles.mIconCData =[];
guidata(handles.figure, handles);
uiresume(handles.figure);

function Icon Editor_CloseRequestFcn(hObject, eventdata, handles)
uiresume(hObject);

他の方法ではカラー パレットが閉じないようにするには、その closerequestfcn をオーバーライドして動作しないようにします。

% in colorPalette
function figure_CloseRequestFcn(hObject, eventdata, handles)
% Don't close this figure. It must be deleted from Icon Editor

ツール パレットに対して同じことを行います。

% in toolPalette
function figure_CloseRequestFcn(hObject, eventdata, handles)
% Don't close this figure. It must be deleted from Icon Editor

最後に、output 関数において 3 つの GUI をすべて削除します。

% in Icon Editor
function varargout = guide_iconeditor_OutputFcn(hObject, ...
        eventdata, handles)
% Return the cdata of the icon. If cancelled, this will be empty
varargout{1} = handles.mIconCData;
delete(handles.toolPalette);
delete(handles.colorPalette);
delete(hObject);
この情報は役に立ちましたか?