我可以使用 Objective-C++ 在 cocoa 中创建一个窗口,然后将该文件链接到 C++ 文件吗?

问题描述 投票:0回答:1

Cocoa 的问题在于,它主要使用 Swift 和 Objective-C,导致 Cocoa 几乎不可能链接到 c++

我尝试了一堆代码片段,但由于某种无法解释的原因,它们都不起作用。但我的逻辑是 Objective-C++。显然,您可以在 Objective-C++ 文件中将 Objective-C 与 C++ 结合起来。 我尝试了一些代码,但没有一个能很好地工作

c++ objective-c cocoa objective-c++
1个回答
0
投票

为了帮助您入门,以下源代码将从使用 .mm 文件扩展名(即 wnd.mm)的 cpp 类创建 Cocoa 窗口。它不包括到 cpp 文件的链接。该演示是使用 clang 从终端编译的。

// compile and run in Terminal
// $ clang wnd.mm -framework Cocoa -o guiPlus && ./guiPlus

#include <Cocoa/Cocoa.h>

NSTextView *txtView;

//prints formatted NSString with line feed
void MyLog(NSString *formatString, ... ) {
va_list ap;
va_start( ap, formatString );
NSString *format = [[NSString alloc] initWithFormat:@"%@\n", formatString];
NSString *str = [[NSString alloc] initWithFormat:format arguments:ap];
[txtView insertText:str replacementRange:NSMakeRange( [[txtView string] length], 0 )];
va_end( ap );
}

class Window {
public:
 void buildWnd();
 void printContent();
private:
 NSWindow *window;
};

void Window::buildWnd() {
#define _wndW  600
#define _wndH  550
    
window = [ [ NSWindow alloc ] initWithContentRect:NSMakeRect( 0, 0, _wndW, _wndH )
    styleMask: NSWindowStyleMaskClosable | NSWindowStyleMaskTitled
    backing:NSBackingStoreBuffered defer:YES];
[window center];
[window setTitle: @"Test window" ];
[window makeKeyAndOrderFront:nil];
    
// **** NSTextView **** //
txtView = [[NSTextView alloc] initWithFrame:NSMakeRect(0,60,_wndW,_wndH-60)];
[txtView setFont:[NSFont fontWithName:@"Lucida Grande" size:14]];
[[window contentView]addSubview:txtView];
NSLog(@"Kilroy was here.");

// **** Quit btn **** //
 NSButton *quitBtn = [[NSButton alloc]initWithFrame:NSMakeRect( _wndW - 60, 10, 40, 40 )];
 [quitBtn setBezelStyle:NSBezelStyleCircular ];
 [quitBtn setTitle: @"Q" ];
 [quitBtn setAction:@selector(terminate:)];
 [[window contentView] addSubview: quitBtn];
}

void Window::printContent(){
 MyLog(@"Hello world!!");
 MyLog(@"window = %@", window);
}

int main () {
 [NSApplication sharedApplication];
 Window w;
 w.buildWnd();
 w.printContent();
 [NSApp run];
 return 0;
}

© www.soinside.com 2019 - 2024. All rights reserved.