我正在尝试将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和视图。
答案 0 :(得分:0)
单击按钮时触发的动作方法(完整的按下和释放顺序)不是这样的事件。这是一系列事件的结果。
您需要操作的级别并不完全清楚,但您可能需要使用NSApplication
的自定义子类并覆盖-sendEvent:
。在那里你将得到低级别的事件,如左键按下,左键按钮,按键,按键等。
如果您只对单个窗口感兴趣,则可以改为使用NSWindow
的自定义子类并覆盖-sendEvent:
。
如果您不允许以正常方式通过Cocoa处理事件(通过在任一覆盖中调用super
),那么您负责所有应用程序对事件的响应。您可以依靠窗口控件中的单击来关闭,最小化或全屏/缩放窗口。点击Cocoa按钮不起作用。等等。所以,你必须仔细选择你做的或不做的事情。
要获得对按钮的额外控制,您可以继承NSButton
,NSButtonCell
或两者,并覆盖一堆方法。例如,您可能希望覆盖按钮单元格类中的-startTrackingAt:inView:
,-continueTracking:at:inView:
和-stopTracking:at:inView:mouseIsUp:
。