0

最初は、カスタム コントロールを含む 1 つのウィンドウがありました。マウスで移動したイベントを受け入れるようにするには、awakeFromNib に入れます。

コード:

[[セルフウィンドウ] makeFirstResponder:self]; [[セルフウィンドウ] setAcceptsMouseMovedEvents:YES];

今、私は同じウィンドウでそれらのうちの 4 つを使用して何かを行っていますが、これはもううまく機能しません。まず、コントロールの awakeFromNib からそれらを取り出し、appController を使用してそれを管理することにしました。つまり [window makeFirstResponder:View]

私の質問は、それぞれがマウス移動イベントに応答するようにしたい場合、同じビューでこれらのうちの 4 つを管理するにはどうすればよいですか? 現在、window に mouseMoved イベントに応答するように指示しましたが、mouseMoved に応答するビューはありません。

4

1 に答える 1

1

また、YES を返すように -acceptsFirstResponder をオーバーライドする必要があります。

    #pragma mark NSResponder オーバーライド
    - (BOOL)FirstResponder を受け入れる
    {
    はいを返します。
    }

-mouseMoved イベントはコストがかかるため、コントロールの -mouseExited メッセージが呼び出されたときにマウス移動イベントをオフにし、-mouseEntered でオンにします。

    - (void)mouseEntered:(NSEvent *)theEvent
{
    [[セルフウィンドウ] setAcceptsMouseMovedEvents:YES];
    [[セルフウィンドウ] makeFirstResponder:self];
}

- (void)mouseMoved:(NSEvent *)theEvent
{
...
}

- (void)mouseExited:(NSEvent *)theEvent
{
    [[セルフ ウィンドウ] setAcceptsMouseMovedEvents:NO];
}

カスタム コントロール アプリケーションでこれを簡単にテストしました。コントロールをnibファイルで数回複製したところ、期待どおりに機能しました。

以下も必要になる場合があります。

- (void)awakeFromNib
{
    [[セルフウィンドウ] setAcceptsMouseMovedEvents:YES];
    [self addTrackingRect:[self bounds] owner:self userData:NULL assumeInside:YES];
}

-setAcceptsMouseMovedEvents は必要ないと思いますが、トラッキング rect コードは必要だと確信しています。assumeInside: パラメータの値を試す必要があるかもしれませんが、それは文書化されています。

于 2009-02-02T22:32:23.267 に答える