我已经继承了NSWindow,并拥有一个实现以下方法的MYWindow类:
-(void)resetCursorRects {
NSImage *image = [NSImage imageNamed:@"cursor.png"];
[image setSize:NSMakeSize(32, 32)];
NSCursor *cursor = [[NSCursor alloc] initWithImage:image hotSpot:NSMakePoint(1, 1)];
[super resetCursorRects];
[self addCursorRect:[self bounds] cursor:cursor];
}
这将更改整个窗口的光标,我将看到cursor.png而不是默认的鼠标指针。问题是,这仅在MYWindow设置为键窗口时才起作用,而键窗口当然并不重要。
在我的项目开始时,我只有一个主窗口,但是现在我需要有两个不同的MYWindow。两个窗口的问题不能同时设置为键窗口,因此自定义鼠标指针仅显示在活动窗口上。我需要单击另一个窗口以使光标出现。
有没有办法解决?所以我在两个窗口上都有一个自定义光标吗?
编辑:尝试了NSTrackingArea
我将此添加到了内容视图的init方法中:
self.trackingArea = [[NSTrackingArea alloc] initWithRect:[self frame] options: (NSTrackingCursorUpdate | NSTrackingActiveAlways | NSTrackingMouseMoved) owner:self userInfo:nil];
[self addTrackingArea:self.trackingArea];
然后,我覆盖了cursorUpdate:
-(void)cursorUpdate:(NSEvent *)event {
NSLog(@"event : %@", event);
[[NSCursor crosshairCursor] set];
}
当包含NSImageView派生类的NSWindow是关键窗口时,这将使crosshairCursor显示。但是,如果我在应用程序内使另一个NSWindow成为键窗口,则光标会再次返回到标准光标。难道我做错了什么?
现在,我终于找到了可行的解决方案。我不知道这将来是否会咬我,但至少在测试时似乎可行。
感谢Wil的例子,它使我半途而废。但是只有当我最终将它与resetCursorRects结合在一起,并在每个视图中使用特定的游标定义了一个游标rect时,才可以。这花了我很长时间才弄清楚,我不知道解决方案是否是最佳的(欢迎提出改进建议)
下面是使它最终对我有用的完整示例(self.cursor是光标的一个实例)
- (void)viewWillMoveToWindow:(NSWindow *)newWindow {
NSTrackingArea *const trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect options:(NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveAlways | NSTrackingInVisibleRect) owner:self userInfo:nil];
[self addTrackingArea:trackingArea];
[self.window invalidateCursorRectsForView:self];
}
- (void)resetCursorRects {
[super resetCursorRects];
[self addCursorRect:self.bounds cursor:self.cursor];
}
- (void)mouseEntered:(NSEvent *)theEvent {
[super mouseEntered:theEvent];
[self.cursor push];
}
- (void)mouseExited:(NSEvent *)theEvent {
[super mouseExited:theEvent];
[self.cursor pop];
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句