3

特定のキーを押すと、ユーザー インターフェイスで何らかのアクションが開始されるように設計したユーザー インターフェイスがあります。Figure の keypressfcn コールバックの関数を定義しようとしましたが、他の UI 要素がアクティブな要素である場合、その要素の keypressfcn が呼び出されます (これは空です)。UI 内のすべての子要素に同じ keypressfcn 関数ハンドルを割り当てずに、図全体のキー押下をキャプチャするにはどうすればよいですか?

4

2 に答える 2

3

WindowKeyPressFcn コールバックが私が望むことを行うことがわかりました。これは Figure のプロパティですが、注意してください、それはまさにその通りに動作します - これがアクティブな Figure である間 (アクティブな要素が何であるかに関係なく)、キー押下をキャプチャします。これが本当に必要かどうかを検討してください。たとえば、編集要素にフォーカスがある場合、入力時に WindowKeyPressFcn が起動します。

于 2012-09-24T15:26:57.043 に答える
2

残念ながら、すべてuicontrolのを定義する必要がありますKeyPressFcnuicontrols考えてみてください: もしあなたが Matlab を設計したとしたら、ユーザーがすべての に対して 1 つのマスター機能のみを使用できるようにしながら、異なる に対して異なるキープレス機能を割り当てるオプションを同時に開いたままにしておくにはどうすればよいでしょう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と、ラジオ グループである親の が呼び出され、親の である uipanel に呼び出しが転送され、親のあるuipanelKeyPressFcnに呼び出しが転送されます。あなたのフィギュアの。KeyPressFcnKeyPressFcn

要するに、あなたがどれほど深くネストされていてuicontrolも、呼び出しは常に Figure までずっと転送されます。

「メイン」図が作成される関数でこの関数をネストされた関数として定義すると、すべてをより効率的に実行できます。

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

私のコードが読みやすいままになるように。

于 2012-09-21T15:24:25.723 に答える