Main Content

그래픽스 객체에 대한 콜백 만들기

콜백이란?

콜백은 그래픽스 객체 클릭, Figure 창 닫기와 같이 미리 정의된 어떤 사용자 동작에 응답하여 실행되는 명령입니다. 동작을 처리하는 콜백 함수를 작성한 다음 그 함수를 사용자 동작과 연결된 콜백 속성에 할당하여 특정 사용자 동작에 대한 응답을 프로그래밍할 수 있습니다. 예를 들어, Figure에 대한 ButtonDownFcn 콜백을 만들어 사용자가 Figure를 클릭하는 것에 대한 응답을 프로그래밍할 수 있습니다.

여기에서는 Line 객체, Axes 객체, Figure 객체와 같은 그래픽스 객체에 대한 콜백 작성 예제를 소개합니다. 특정 그래픽스 객체와 연결된 콜백의 목록을 보려면 해당 객체의 속성을 참조하십시오. 예를 들어, Figure 콜백 목록은 Figure 속성 항목을 참조하십시오.

앱의 UI 컴포넌트에 대한 콜백 작성에 대한 자세한 내용은 프로그래밍 방식으로 만든 앱에 대한 콜백 만들기 항목을 참조하십시오.

기본 콜백 만들기

그래픽스 콜백 함수는 적어도 두 개의 입력 인수를 받아야 합니다.

  • 콜백이 실행되고 있는 그래픽스 객체 — 콜백 함수 내에서 이 인수를 사용하여 객체를 참조합니다.

  • 이벤트 데이터 구조체 — 콜백 함수 내에서 이 인수를 사용하여 콜백 속성 및 객체와 관련된 사용자 동작에 대한 정보에 액세스합니다. 많은 그래픽스 객체 콜백에서 이 구조체는 비어 있습니다.

사용자 동작에 대한 응답으로 콜백이 실행될 때마다 MATLAB®이 콜백 함수를 호출하고 이 두 개의 인수를 함수에 전달합니다.

콜백을 만들려면 먼저 필수 입력 인수를 사용하여 콜백 함수를 정의하십시오. 그런 다음 함수에 대한 핸들을 관련된 콜백 속성에 할당합니다.

콜백 함수 정의하기

예를 들어, figureCallback.m이라는 새 파일을 만들고 figureCallback이라는 콜백 함수를 정의해 보겠습니다. 콜백 함수는 Figure 창에서 사용자가 키를 누를 때 동작을 처리합니다. 다음 두 개의 입력 인수를 받도록 콜백 함수를 정의합니다.

  • src — 첫 번째 인수를 사용하여, Figure에 플로팅된 Line 객체를 찾으려고 콜백을 실행 중인 특정 Figure를 참조합니다.

  • event — 두 번째 인수를 사용하여 키 누름 사용자 동작에 대한 특정 정보에 액세스합니다. 누른 키가 +이면 선의 너비를 늘리고 -이면 선의 너비를 줄입니다.

function figureCallback(src,event)
line = findobj(src,"Type","Line");
if event.Character == "+"
    line.LineWidth = line.LineWidth+1;
elseif event.Character == "-"
    line.LineWidth = max(line.LineWidth-1,0.5);
end
end

콜백 함수를 콜백 속성에 할당하기

명령 창에서 Figure 객체를 만듭니다. @ 연산자를 사용하여 함수 핸들을 Figure의 WindowKeyPressFcn 속성에 할당합니다. 이 콜백은 Figure 창에서 사용자가 키를 누를 때 실행됩니다. 그런 다음, 약간의 데이터를 현재 Figure에 플로팅합니다.

f = figure(WindowKeyPressFcn=@figureCallback);
plot(1:10)

코드를 실행하고 +를 누릅니다. 선의 너비가 늘어납니다.

참고

키보드 기반 콜백은 현재 라이브 편집기의 Figure에서 지원되지 않습니다. 자세한 내용은 Figure 속성 항목을 참조하십시오.

추가 입력 인수를 사용하여 콜백 만들기

익명 함수를 통해 추가 입력 인수를 사용하여 콜백을 만들 수 있습니다. 먼저 임의 개수의 입력 인수를 사용하여 콜백 함수를 정의합니다. 그런 다음, 관련 콜백 속성값을 MATLAB이 콜백에 전달하는 필수적 소스 인수 및 이벤트 인수를 받는 익명 함수로 지정한 다음 적절한 입력값으로 콜백 함수를 호출합니다.

참고

콜백을 익명 함수로 만드는 기능은 현재 라이브 편집기의 Figure에서 지원되지 않습니다.

콜백 함수 정의하기

예를 들어, 사용자가 마커를 클릭할 때 마커 가장자리 색을 변경한 다음 명령 창에 x, y 좌표를 표시하는 콜백 함수를 정의해 보겠습니다. displayCoordinates.m이라는 새 파일을 만들고 displayCoordinates라는 콜백 함수를 정의합니다. 다음 세 개의 입력 인수를 받도록 콜백 함수를 정의합니다.

  • src — 첫 번째 인수를 사용하여, 콜백이 실행되고 있는 특정 그래픽스 객체를 참조합니다.

  • ~ — 두 번째 인수에 ~ 문자를 지정하여 함수가 콜백 이벤트 데이터를 사용하지 않음을 나타냅니다.

  • ax — 세 번째 인수를 사용하여 좌표축에서 마우스 포인터의 위치에 액세스합니다.

function displayCoordinates(src,~,ax)
src.MarkerEdgeColor = rand(1,3);
disp(ax.CurrentPoint(1,1:2))
end

콜백 함수를 콜백 속성에 할당하기

명령 창에서 scatter 함수를 사용하여 axes 객체에 약간의 데이터를 플로팅합니다. 익명 함수를 사용하여 Scatter 객체의 ButtonDownFcn 콜백 속성을 지정합니다. 익명 함수는 MATLAB이 콜백에 전달하는 소스 인수 및 이벤트 인수를 받은 다음 필수 입력값을 사용하여 displayCoordinates 함수를 호출합니다.

ax = axes;
x = randn(100,1);
y = randn(100,1);
scatter(x,y,"ButtonDownFcn",@(src,event)displayCoordinates(src,event,ax))

코드를 실행하고 마커를 클릭합니다. 마커 가장자리 색이 변경되고 x, y 좌표가 명령 창에 표시됩니다.

자세한 내용은 익명 함수 항목을 참조하십시오.

익명 함수는 소스 입력값과 이벤트 입력값 이외의 추가적인 콜백 입력 인수를 지정하는 데 있어 가장 큰 유연성을 제공하지만, 경우에 따라 대신 셀형 배열을 사용하여 콜백을 지정할 수도 있습니다. 콜백 함수가 소스 입력값과 이벤트 입력값 다음에 다른 인수를 받는 경우 셀형 배열을 지정하여 콜백을 할당할 수 있습니다. 셀형 배열의 첫 번째 요소는 콜백 함수 핸들이고 다른 추가 요소는 소스 및 이벤트 다음에 함수에 전달할 입력값입니다.

예를 들어, 셀형 배열을 사용하여 Scatter 객체의 ButtonDownFcn 콜백 속성을 대신 지정할 수 있습니다. 배열의 첫 번째 요소는 displayCoordinates 함수에 대한 핸들이고 두 번째 요소는 소스 인수 및 이벤트 인수 다음에 displayCoordinates 함수에 전달되는 axes 객체입니다.

ax = axes;
x = randn(100,1);
y = randn(100,1);
scatter(x,y,"ButtonDownFcn",{@displayCoordinates,ax})

콜백을 디폴트로 만들기

plot 또는 bar와 같은 플로팅 함수를 호출하면 MATLAB에서는 새 그래픽스 객체를 만들고 대부분의 Figure 속성 및 axes 속성을 재설정합니다. 따라서 특정 그래픽스 객체에 대해 정의한 콜백 함수는 MATLAB에 의해 제거될 수 있습니다. 대신 특정 유형의 모든 객체에 대해 실행되는 콜백을 만들려면 루트 수준에서 콜백 함수를 디폴트로 할당합니다.

콜백 함수 정의하기

customizeGrid.m이라는 새 파일에 customizeGrid라는 함수를 정의합니다. 이 함수는 axes 객체를 받고 그리드 선을 활성화하고 사용자 지정합니다.

function customizeGrid(ax)
ax.XGrid = 'on';
ax.YGrid = 'on';
ax.GridLineStyle = '--';
ax.GridAlpha = 0.5;
end

콜백 함수를 콜백 속성에 할당하기

groot 객체에 디폴트 좌표축 CreateFcn 콜백을 설정하여 MATLAB이 새 axes 객체를 생성할 때마다 customizeGrid 함수를 실행합니다. 속성을 두 개의 필수 콜백 입력값을 받는 익명 함수로 할당한 다음, 생성되는 Axes 객체에 대해 customizeGrid 함수를 호출합니다.

set(groot,"defaultAxesCreateFcn",@(src,~)customizeGrid(src))

Figure에 여러 개의 좌표축을 만듭니다. 각각에 대해 사용자 지정된 그리드가 나타납니다.

ax1 = axes("Position",[0.1 0.1 0.8 0.35]);
ax2 = axes("Position",[0.1 0.55 0.8 0.35]);

자세한 내용은 디폴트 속성값 항목을 참조하십시오.

디폴트 콜백은 MATLAB 세션에 대해 설정된 상태로 유지됩니다. 모든 MATLAB 세션에 대해 디폴트 콜백을 설정하려면 디폴트 값 할당을 startup.m 파일에 추가하십시오. 자세한 내용은 startup을 참조하십시오.

관련 항목