点击自定义NSWindow

时间:2015-04-03 23:24:20

标签: macos nswindow

我有自定义的NSWindow,自定义NSView设置为contentView。

窗口初始化为:

[window setOpaque:NO];
[window setBackgroundColor: [NSColor clearColor]];
[window setHasShadow: NO];

[window setAcceptsMouseMovedEvents: YES];
[window setLevel: NSFloatingWindowLevel];

内容视图,在其drawRect中绘制由纯色填充的简单圆圈。

所有这一切正常 - 窗口出现在桌面上,我看到了那个圆圈。

唯一不起作用的是:整个窗口矩形对于鼠标点击不是透明的。如果我在圆圈外面点击(但在隐形窗口框内),我的视图会收到mouseDown事件,但我希望激活底层窗口(或桌面)。

看来我需要在我的NSWindow课程上覆盖类似hitTest方法的东西,但不幸的是没有这样的方法。

问题是:是否可以让NSWindow在OS X中使用自定义点击区域。如果“是”那么如何?

更新:

查看按预期工作的RoundTransparentWindow样本 - 窗口在透明区域中单击。好像这件作品:

- (void)drawRect:(NSRect)rect {
   ...
   // Reset the window shape and shadow.
    if (shouldDisplayWindow) {
        [[self window] display];
        [[self window] setHasShadow:NO];
        [[self window] setHasShadow:YES];
    }
}
CustomView.m中的

与问题有关,但即便如此(在我的情况下)我也无法实现鼠标点击的透明度:(

1 个答案:

答案 0 :(得分:4)

回答我自己的问题:

在OS X上,为了让窗口具有自定义形状,必须在以下条件下点击透明区域:

  1. 创建窗口必须,仅NSBorderlessWindowMask设置为[window setStyleMask: NSBorderlessWindowMask]

  2. 不得致电[window setIgnoresMouseEvent: NO]。因为该方法显然包含Apple的一个错误。

  3. 窗口的contentView 必须使用图层。所以类似这样的[[window contentView] setWantsLayer: YES]也会有效地禁用点击。

  4. 以防万一:所有这些都是关于OS X上Sciter的分层窗口处理

    "Sciter clock" sample on Windows, OS X and Linux