繁体   English   中英

重新实现Mac OS X Dock的自动隐藏

[英]Reimplementing the Mac OS X Dock's auto hide

我正在尝试在Objective-C中制作服务器监视器,其行为类似于OS X中的底座。我希望当鼠标移至屏幕的一侧时使其从屏幕的一侧滑动。 ,有点像启用自动隐藏功能时的底座。 我不知道从哪里开始。

我猜我需要有一个带有NSBorderlessWindowMask蒙版的窗口,但是在那之后我很茫然。 我是只显示该窗口的1个像素,然后等待mouseOver事件,还是仅仅是可以合理完成工作的简单解决方案? 如果那是最好的方式,我将如何检查鼠标悬停事件?

我认为您的想法正确。 不过请记住,根据您要执行的操作,无边界窗口并不是最容易使用的东西(它们可能很棘手,尤其是在Spaces和Exposé之类的东西可能会增加复杂性的情况下)。

如果这只是一个个人项目,则可能只需要显示一个像素边缘即可。 如果这是一个专业项目,建议您使用Event Taps(稍后会详细介绍)。

如果采用“个人项目”方式,则可以在显示的窗口边缘保留1 px,使用自定义的NSView子类,该子类将自身绘制为透明,并设置NSTrackingArea来通知您mouseEntered:事件。

要绘制透明区域,可以在drawRect中执行以下操作:

- (void)drawRect:(NSRect)frame {
   [[NSColor clearColor] set];
   NSRectFill(frame);
}

要设置跟踪区域,请在您的视图子类的awakeFromNib中执行以下操作:

- (void)awakeFromNib {
 NSTrackingArea *tracker = [[[NSTrackingArea alloc] initWithRect:[self frame]
   options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways)
   owner:self
   userInfo:nil] autorelease];

 [self addTrackingArea:tracker];
}

- (void)mouseEntered:(NSEvent *)theEvent {
 [[[self window] windowController] showWindow:self];
}

- (void)mouseExited:(NSEvent *)theEvent {
 [[[self window] windowController] myHideMethodName:self];
}

假设您要重写窗口控制器的showWindow:方法以执行动画或其他操作。 顺便说一句,无论您做什么,都不要寻找鼠标移动的事件。 (对于您而言,这并不重要,因为您的区域可能很小,但是总的来说,查找鼠标移动的事件是错误的方式,因为它们会迅速淹没事件队列。请在Quartz Debug来查看大多数软件是如何做到的)。 请记住,即使视图可以使其透明,也仍然可以防止鼠标事件进入其下方的任何内容(可能是其他窗口或桌面等)。

如果您想走“专业”路线,则应该能够设置“事件分接器”以基本完成跟踪区号所做的相同操作。 使用此路线,您可以将窗口完全隐藏,以免干扰任何东西。 要了解事件点击的工作方式,您可能需要下载以下2个应用程序:

http://brockerhoff.net/quay/

http://pfiddlesoft.com/eventtapstestbench/

第一个是一个很酷的示例,说明如何使用事件点击来完成一些很酷的事情(请阅读“帮助”以查看一些更高级的功能)。 当您将鼠标移到Dock左侧项目上方时,Rainer使用事件点击来轻击Dock进行计算。 然后,他可以显示自己的自定义菜单,而不是Dock的内置菜单。

第二个应用将是检查Quay(或QuayMenu,实际上)对其事件轻拍进行的操作和必不可少的。

顺便说一句,事件点击API是在Quartz中的(以下是用于设置事件点击的示例):

CFMachPortRef CGEventTapCreate (
   CGEventTapLocation tap,
   CGEventTapPlacement place,
   CGEventTapOptions options,
   CGEventMask eventsOfInterest,
   CGEventTapCallBack callback,
   void *refcon
);

我对事件拍子不甚了解,无法举一个例子来说明如何设置它,但这至少应该为您指明正确的方向。

希望这可以帮助....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM