我在opengl中创建了游戏,我在窗口模式下遇到了双光标(我和系统)的问题。 我隐藏了系统光标,只在游戏中使用我的光标。
当窗口处于停靠状态时,我将光标移到停靠栏上(光标仍在窗口内),显示系统光标。从这一刻起,我有了双光标(我和系统)。
我尝试了三种解决方案:
也许这应该以完全不同的方式解决。
答案 0 :(得分:0)
你可以尝试以下任何一种方法:
这不是一个严格的编程问题,而是一个可用性问题。您应该决定用户希望做什么并实现它。我相信可以不在窗口模式下显示游戏光标(除非您正在编写一个需要许多不同游标的策略游戏)。
答案 1 :(得分:0)
不是使用CGDisplayHideCursor,而是使用神秘的不可读的隐藏计数,解决方案是使用透明光标设置覆盖整个窗口的光标矩形。这非常强大 - 它可以在鼠标位于窗口内时可靠地隐藏光标并在其他所有时间显示它。
我最终通过查看Simple DirectMedia Layer(SDL)2源代码来解决这个问题 - 这是一个从那里提取的工作最小的例子。
覆盖NSView子类实现中的resetCursorRects:
static NSCursor* invisibleCursor()
{
static NSCursor *invisibleCursor = NULL;
if (!invisibleCursor) {
/* RAW 16x16 transparent GIF */
static unsigned char cursorBytes[] = {
0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x10, 0x00, 0x10, 0x00, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF9, 0x04,
0x01, 0x00, 0x00, 0x01, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x10,
0x00, 0x10, 0x00, 0x00, 0x02, 0x0E, 0x8C, 0x8F, 0xA9, 0xCB, 0xED,
0x0F, 0xA3, 0x9C, 0xB4, 0xDA, 0x8B, 0xB3, 0x3E, 0x05, 0x00, 0x3B
};
NSData *cursorData = [NSData dataWithBytesNoCopy:&cursorBytes[0]
length:sizeof(cursorBytes)
freeWhenDone:NO];
NSImage *cursorImage = [[[NSImage alloc] initWithData:cursorData] autorelease];
invisibleCursor = [[NSCursor alloc] initWithImage:cursorImage
hotSpot:NSZeroPoint];
}
return invisibleCursor;
}
- (void)resetCursorRects
{
[super resetCursorRects];
[self addCursorRect:[self bounds] cursor:invisibleCursor()];
}