2012-09-21 2 views
3

사용자 인터페이스에서 특정 키를 누르기를 원하는 사용자 인터페이스가 있습니다. 그림의 keypressfcn 콜백에 대한 함수를 정의하려고 시도했지만 다른 UI 요소가 활성 요소 인 경우 해당 요소의 keypressfcn이 호출됩니다 (비어 있음). UI 내의 모든 하위 요소에 동일한 keypressfcn 함수 핸들을 할당하지 않고 전체 그림에 대해 키 누르기를 캡처하는 방법은 무엇입니까?부모에게 전달되는 Matlab 이벤트

답변

3

내가 원하는 것을 WindowKeyPressFcn 콜백에서 찾았습니다. 이는 그림의 속성이지만 조심스럽게 말합니다. 활성 요소 인 동안 키 누르기를 캡처합니다 (활성 요소가 무엇인지에 관계없이). 예를 들어 편집 요소에 포커스가있는 경우 WindowKeyPressFcn이 입력 될 때 실행됩니다.

2

각각 uicontrolKeyPressFcn을 정의해야 할까봐 걱정됩니다. 생각해보십시오. Matlab을 설계했다면 다른 uicontrols에 대해 다른 키 누르기 기능을 할당 할 수있는 옵션을 동시에 열어 놓고 모든 uicontrols에 하나의 마스터 기능 만 사용할 수있는 방법은 무엇입니까?

각각 새로운 uicontrol은이를 수행하고 싶다는 것을 알고 있어야합니다.이 작업은 KeyPressFcn과 동일합니다.

이 작업을 수행하는 가장 쉬운 방법은

function KeyPressFcnFwd(obj,event) 
    prn = get(obj, 'parent') 
    fcn = get(prn, 'KeyPressFcn'); 
    fcn(prn,event); 
end 

같은 몇 가지 일반적인 함수를 작성하고 다음과 같이 uicontrols을 정의하는 것입니다 :이 일부 라디오 버튼에 키 입력을 할 것 같은 그 일을

button = uicontrol(... 
    'style', 'pushbutton', ... 
    ... 
    'KeyPressFcn', @KeyPressFcnFwd); 

부모의 KeyPressFcn (이는 라디오 그룹 임)으로 전화를 걸면 부모의 KeyPressFcn (uipanel)이 호출되어 부모의 012로 통화가 전달됩니다, 마지막으로 귀하의 그림은 KeyPressFcn입니다.

요약하면 uicontrol이 얼마나 깊게 중첩되어 있더라도 통화는 항상 그림으로 전달됩니다.

는 "주"그림이 생성되는 함수에 중첩 된 함수로이 함수를 정의하면, 당신은 그것을 할 수있는보다 효율적으로 모든 비트 : 당신이이 없어 너무

function main %# toplevel function 

    ... 

    mainFig = figure(...) %# your main figure 

    ... 

    %# nested function 
    function KeyPressFcnFwd(obj,event)    
     fcn = get(mainFig, 'KeyPressFcn'); 
     fcn(mainFig,event); 
    end 

    ... 

    %# Function to build the GUI 
    %# can be a subfunction, nested function or external function 
    populateMainWin(mainFig, @KeyPressFcnFwd); 

    ... 


end 

KeyPressFcn 님의 전체 트리를 호출하는 오버 헤드가 발생했습니다. 내 코드를 읽을 유지되도록

상황에서

이 보일러의 많은 잠재적으로 (그리고이 훌륭한 후보), 나는 보통

function handle = uibutton(parent, text, varargin) 

    handle = uicontrol(... 
     'parent', parent, ... 
     'style' , 'pushbutton', ... 
     'units' , 'normalized', ... 
     'string', text, ... 
     'KeyPressFcn', @KeyPressFcnFwd, ... 
     varargin{:}); 

end 

같은 일부 shorthands을 정의합니다.

관련 문제