以编程方式处理Cocoa事件?

时间:2014-11-19 23:44:04

标签: c++ cocoa objective-c++

我正在尝试将cocoa事件连接到 minimal objective-c ++ cocoa消息代理,该代理将调用我的c ++函数来处理事件。

对于按钮,OnClick,简单,我去:

@interface cocoa_proxy : NSObject
    - (void)action:(id)sender;
@end

@implementation cocoa_proxy
    - (void)action:(id)sender
    {
        exit(0);
    }
@end

cocoa_proxy* proxy = [[cocoa_proxy alloc] init];
[button setTarget:proxy];
[button setAction:@selector(action:)];

但是我不确定如何捕获按钮的其他事件(例如OnPress,OnRelease,OnEnter,OnExit等等),我也不能捕获窗口或视图的事件。 /强> 任何尝试类似路线的尝试,采用略有不同格式的方法(来自各种,不完全相同,但在网络上类似的问题)会导致如下错误:

reason: '-[NSWindow setTarget:]: unrecognized selector sent to instance xxxxx

我已经拥有了一个我想要重用的大型代码库,所以我有一个代理是最重要的,而不仅仅是"在objective-c ++"中做所有事情。

为了完整性,这是我创建窗口的方法

window = [[[NSWindow alloc] initWithContentRect:NSMakeRect(x, y, w, h)
    styleMask:NSTitledWindowMask backing:NSBackingStoreBuffered defer:NO]
        autorelease];

要清楚,我不使用XCode,Interface Builder,任何GUI创建软件或Cocoa感知软件,或利用NIB等概念,一切都是在程序上完成的,并且与objective-c ++的交互最少。

所以我的问题是,我如何处理Button的不同事件,以及如何处理事件(根本),以类似的方式处理Windows和视图。

1 个答案:

答案 0 :(得分:0)

单击按钮时触发的动作方法(完整的按下和释放顺序)不是这样的事件。这是一系列事件的结果。

您需要操作的级别并不完全清楚,但您可能需要使用NSApplication的自定义子类并覆盖-sendEvent:。在那里你将得到低级别的事件,如左键按下,左键按钮,按键,按键等。

如果您只对单个窗口感兴趣,则可以改为使用NSWindow的自定义子类并覆盖-sendEvent:

如果您不允许以正常方式通过Cocoa处理事件(通过在任一覆盖中调用super),那么您负责所有应用程序对事件的响应。您可以依靠窗口控件中的单击来关闭,最小化或全屏/缩放窗口。点击Cocoa按钮不起作用。等等。所以,你必须仔细选择你做的或不做的事情。

要获得对按钮的额外控制,您可以继承NSButtonNSButtonCell或两者,并覆盖一堆方法。例如,您可能希望覆盖按钮单元格类中的-startTrackingAt:inView:-continueTracking:at:inView:-stopTracking:at:inView:mouseIsUp: