私はボーダレス 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: が呼び出されます) が、移動していません... それについてどう思うかわかりません。