gpt4 book ai didi

c++ - 以编程方式处理 Cocoa 事件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:51:55 24 4
gpt4 key购买 nike

我正在尝试将 cocoa 事件连接到一个最小 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 等),我似乎也无法捕获 Window 或 View 的事件。 任何尝试使用类似路线但格式略有不同的方法(来自网络上各种不同但不完全相同但相似的问题)的任何尝试都会导致如下错误:

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 和 Views 的事件。

最佳答案

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

还不完全清楚你需要在什么级别上操作,但你可能需要使用NSApplication的自定义子类并覆盖-sendEvent:。在那里您将获得低级事件,如鼠标左键按下、鼠标左键弹起、按键按下、按键弹起等。

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

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

为了获得对按钮的额外控制,您可以子类化 NSButtonNSButtonCell 或两者,并覆盖一系列方法。例如,您可能想要覆盖 -startTrackingAt:inView:-continueTracking:at:inView:-stopTracking:at:inView:mouseIsUp: 在你的纽扣电池类中。

关于c++ - 以编程方式处理 Cocoa 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com