2016-08-17 6 views
1

그림이 확대/축소 모드 일 때 WindowKeyPressFcn을 사용하고 싶습니다. 이 질문은 최근에 여기에 Overriding ctrl-z behavior in matlab zoom mode,하지만 난 그냥 같은 문제를 보여주기 위해 최소한의 예제를 만들었습니다 (나는 그들의 게시물에 대한 의견을 작성했을지만 아직 충분한 담당자가 없어). 아무도 우리가 누락 된 것을 압니까?MATLAB 확대 모드에서 키 누르기 듣기

function listenWhileZooming 

%% Main problem: 
% I want any key press to change the color of the plot, even when in Zoom 
% mode. I tried to override the mode manager, but don't see any effect. 
%% 

%% Create and then hide the GUI as it is being constructed 
f = figure('Visible','off','units','normalized','Position',[0.1 0.1 0.5 0.5],'windowkeypressfcn',@colorSwap); 

%% Override mode manager 
hManager = uigetmodemanager(f); 
try 
    set(hManager.WindowListenerHandles, 'Enable', 'off'); % HG1 
catch 
    [hManager.WindowListenerHandles.Enabled] = deal(false); % HG2 
end 
set(f, 'WindowKeyPressFcn',@colorSwap); 

%% Plot something 
plot(1,1,'bo') 

%% Make the GUI visible 
f.Visible = 'on'; 

%% Key press callback 
    function colorSwap(source,eventData) 
     myLine = findobj(source,'type','line'); 
     if all(myLine.Color == [0 0 1]) 
      plot(1,1,'ro') 
     else 
      plot(1,1,'bo') 
     end 
    end 

end 

답변

0

나는 그것이 늦었다 고 알고있다. 그러나 이것은 당신이 누락 된 부분이다.

귀하의 코드에서와 같이 f은 숫자 핸들이며 f.WindowKeyPressFcn은 내가 설정했다고 가정합니다. 당신에 의해 설정 f.WindowKeyPressFcn

%% Fix 
Button = findall(f, 'Tag', 'Exploration.ZoomIn'); 
OldClickedCallback = Button.ClickedCallback; 
Button.ClickedCallback = @(h, e) FixButton(f, OldClickedCallback, f.WindowKeyPressFcn); 

Button = findall(f, 'Tag', 'Exploration.ZoomOut'); 
OldClickedCallback = Button.ClickedCallback; 
Button.ClickedCallback = @(h, e) FixButton(f, OldClickedCallback, f.WindowKeyPressFcn); 

function Result = FixButton(Figure, OldCallback, NewCallback) 
    eval(OldCallback); 
    hManager = uigetmodemanager(Figure); % HG 2 version 
    [hManager.WindowListenerHandles.Enabled] = deal(false); 
    Figure.KeyPressFcn = []; 
    Figure.WindowKeyPressFcn = NewCallback; 
    Result = true; 
end 

, 그것은 줌 핸들러에 의해 초기화됩니다. 따라서 우리는 두 줌 버튼을 하이 잭 (Pan 또는 Rotate과 동일하게 수행 할 수 있습니다) 먼저 원래 콜백을 호출 한 다음 수정 사항을 다시 적용하십시오. 또한 KeyPressFcn을 삭제하는 것을 잊지 마세요. 모든 버튼에 동일한 FixButton을 사용할 수있어 매우 우아합니다.