2016-08-17 3 views
1

Figureがズームモードのときに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があなたによって設定されているものとします。

%% 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 

f.WindowKeyPressFcnの後、ズームハンドラでリセットされます。したがって、最初に元のコールバックを呼び出してから修正を再度適用するには、両方のズームボタンをハイジャック(PanまたはRotateと同じ操作を行うことができます)します。また、KeyPressFcnを削除することを忘れないでください。すべてのボタンに同じFixButtonを使用できるので、かなりエレガントです。

関連する問題