NSView Cocoa se événements mouseDown fou?
Question
Ohé tout - j'ai une sous-classe NSView que je passe par programme sur mouseDown. Ce qui fonctionne, mais il a un effet secondaire impair:
- je clique sur le sous-vue. Le sous-vue se éloigne [bon]
- J'attends un certain temps. Je ne bouge pas ma souris. Étant donné que la sous-vue est déplacé est plus sous mon curseur.
- je clique sur ma souris à nouveau.
- J'attends la fenêtre sous-jacente pour obtenir l'événement mouseDown (depuis le sous-vue n'est plus sous mon curseur), mais mon sous-vue obtient en quelque sorte cet événement [ODD]
- L'événement mouseDown montre clairement que le clic était en dehors des limites de ma sous-classe [ODD]
- L'événement mouseDown montre aussi clairement que le nombre de clics a incrémentée, même si je l'ai attendu quelques secondes entre deux clics de souris [ODD]
... Il doit y avoir une explication pour ce que je vois. Voici mon code - il suffit de créer un nouveau projet d'application Cocoa appelé « OddMouse » et copier ce qui suit dans le fichier OddMouseAppDelegate.h:
#import <Cocoa/Cocoa.h>
@interface OddMouseAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow *window;
}
@property (assign) IBOutlet NSWindow *window;
@end
@interface OddView : NSView {
}
@end
... et ce qui suit dans le fichier OddMouseAppDelegate.m:
#import "OddMouseAppDelegate.h"
@implementation OddMouseAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[[contentView fenêtre] addSubview: [[OddView alloc] init]]; } @end
@implementation OddView
- (id)init {
self = [super initWithFrame:NSMakeRect(100, 100, 100, 100)];
return self;
}
- (void)drawRect:(NSRect)dirtyRect {
NSBezierPath *bz = [NSBezierPath bezierPathWithRoundedRect:[self bounds]
xRadius:9 yRadius:9];
[[NSColor blueColor] set];
[bz fill];
}
- (void)mouseDown:(NSEvent *)event {
NSPoint locationInMyself = [self convertPoint: [event locationInWindow]
fromView: nil];
NSLog(@"MOUSE DOWN COORDS: x=%f y=%f, count=%i",
locationInMyself.x, locationInMyself.y, [event clickCount]);
float newX = [self frame].origin.x+100;
float newY = [self frame].origin.y+100;
[self setFrame:NSMakeRect(newX, newY, 100, 100)];
}
@end
... puis construire, puis exécutez, alors témoin! FWIW, voici ce que je vois dans la console:
10-01-15 11:38:24 PM OddMouse[4583] MOUSE DOWN COORDS: x=48.000000 y=56.000000, count=1
10-01-15 11:38:37 PM OddMouse[4583] MOUSE DOWN COORDS: x=-52.000000 y=-44.000000, count=2
10-01-15 11:38:44 PM OddMouse[4583] MOUSE DOWN COORDS: x=-152.000000 y=-144.000000, count=3
10-01-15 11:38:52 PM OddMouse[4583] MOUSE DOWN COORDS: x=-252.000000 y=-244.000000, count=4
10-01-15 11:39:03 PM OddMouse[4583] MOUSE DOWN COORDS: x=-352.000000 y=-344.000000, count=5
La solution
Freaking diable - s'avère que c'était quelque chose se conduit mal avec la vitesse du double-clic - changer les prefs SFA a fait, mais un redémarrage résolu ...