4

私はボーダレス NSPanel を持っています。最初に起動してフォーカスがあるときはドラッグでき、mousedragged メソッドは正しくトリガーされますが、フォーカスを別のアプリに切り替えてから NSPanel (NSNonactivatingPanelMask で設定されている) に戻ると、マウスドラッグされたイベントを受信しなくなりました。

私はまだ mouseup および mousedown イベントを受け取っているので、mousedragged イベントが実行されない理由がわかりません。

何か案は?

初期化する方法は次のとおりです。

   _panel  = [[MyPanel alloc] initWithContentRect:frame
              styleMask:NSBorderlessWindowMask | NSNonactivatingPanelMask
              backing:NSBackingStoreBuffered
              defer:NO];

また、これらすべてのメソッドをパネル クラスに追加しようとしました。

- (BOOL)canBecomeKeyWindow {
    return YES;
}

- (BOOL)canBecomeMainWindow
{
    return YES;
}

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

- (BOOL)acceptsFirstMouse
{
    return YES;
}

そして、マウスダウンでファーストレスポンダーにします(まだ受信しています):

- (void)mouseDown:(NSEvent *)theEvent
{
    [self makeFirstResponder:self];
    [self makeKeyWindow];
    [self setBackgroundColor:[NSColor redColor]];
    [self display];
}

mousedragged には、次のものが含まれています。

- (void)mouseDragged:(NSEvent *)theEvent
{
    [self setBackgroundColor:[NSColor greenColor]];
    [self display];
    NSLog(@"dragged");
}

ウィンドウにフォーカスを合わせたくありません。(以下のサードパーティ製アプリに焦点を当てる必要があります)。

更新: サンプル プロジェクトを追加しました。ここからダウンロードしてください: http://users.telenet.be/prullen/MovingPanel.zip

ご覧のとおり、最初にアプリを実行してドラッグすると、console.log に「ドラッグ」が継続的に出力されます (背景色は緑色になります)。その後、別のアプリに切り替えてから、movingpanel アプリに戻ると、ドラッグしても何も出力されなくなります。(そして、マウスダウン イベント ハンドラで設定されている背景色は赤になります)。

NSNonactivatingPanelMask がなければ、これは正常に機能しますが、パネルの下のウィンドウがアクティブなままであることが重要です。これを達成する別の方法がある場合は、共有してください。

私が気づいたことの 1 つは、パネルをダブルクリック (高速) してからドラッグすると、緑色に変わります (したがって、mousedragged: が呼び出されます) が、移動していません... それについてどう思うかわかりません。

4

1 に答える 1

0

また、[self setMovableByWindowBackground:NO]; を行うと気付きました。その後、それも正しく機能します。setMovableByWindowBackground が機能する方法が、呼び出される mouseDragged に干渉していることに賭けています。それが呼ばれるのはおそらくバグです。

考えられる解決策の 1 つは、独自のウィンドウのドラッグを実装することだと思います。

ウィンドウが動いているときに応答することに本当に関心がある場合は、この質問と回答が必要なものを提供する可能性があります。

マウスでウィンドウを移動するときに通知を受け取る方法は?

于 2013-03-25T01:14:08.147 に答える