2013-03-15 6 views
4

У меня есть NSPanel без полей, когда я впервые запускаю его, и у него есть фокус. Я могу его перетащить, и метод mousedragged запускается правильно, однако, когда я переключу фокус на другое приложение, а затем вернусь к NSPanel (который установлен с NSNonactivatingPanelMask), я больше не получаю mousedragged события.NSPanel не получает событие mousedragged

Я все еще получаю события 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 непрерывно (а цвет фона будет зеленым). Если вы затем перейдете к другому приложению, а затем вернитесь в приложение для переноски, перетаскивание больше ничего не выводит. (и цвет фона будет красным, который установлен в обработчике события mousedown).

Без NSNonactivatingPanelMask это работает так, как должно, но очень важно, чтобы окно под моей панелью оставалось активным. Если есть другой способ сделать это, пожалуйста, разделите.

Одна вещь, которую я также заметил, если вы дважды щелкнете по панели (быстро), а затем перетащите ее, она станет зеленой (так называется mousedragged:), но она не движется ... Не уверен, что подумайте об этом.

ответ

0

Я также заметил, что если я сделаю [self setMovableByWindowBackground: NO]; то он также будет работать правильно. Я уверен, что способ setMovableByWindowBackground мешает вызывать mouseDragged. Вероятно, это ошибка, которая называется вообще.

Я бы предположил, что одним из возможных решений было бы реализовать собственное перетаскивание окна.

Если вы действительно заинтересованы в реагировании на то, когда окно движется, этот вопрос и ответ могут предоставить то, что вам нужно.

How to receive notifications when moving Window by mouse?

+0

Спасибо, что именно этот вопрос! – Wesley

Смежные вопросы