经过数小时的研究,尽管我已经接近了,但我找不到合适的答案。
我的基本需求是为Matlab生成MEX函数,该函数创建一个NSWindow并在屏幕上显示一个NSView。这涉及在编译时制作一个混合的Obj-C ++文件,这是之前完成的,所以这不是问题。
但是,我遇到的所有实现都依赖于OpenGL库,我想避免使用它。 OpenGL库通常用于生成Context,但是在这里我只希望使用一个简单的NSView来填充窗口。因此,理想情况下,实现应仅使用Cocoa,Framework和Appkit框架。
当前,我将以下代码保存到C文件:
#include "mex.h"
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import <AppKit/AppKit.h>
/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
// Create shared application instance
[NSApplication sharedApplication];
// Define content rect
NSRect contentRect = NSMakeRect(0, 0, 500, 500);
// Create window
NSWindow* window = [[NSWindow alloc] initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:false];
// Window settings
[window setBackgroundColor:[NSColor blackColor]];
[window setExcludedFromWindowsMenu:YES];
[window setAlphaValue:1.0];
[window setOpaque:true];
[NSApp activateIgnoringOtherApps:YES];
[window makeKeyAndOrderFront:window];
// Display window
[window display];
// Add view to window
CGRect winRect = [[window contentView] bounds];
NSView* maxView = [[NSView alloc] initWithFrame: winRect];
[maxView setBackgroundColor:[NSColor blackColor]];
[[window contentView] addSubview:maxView];
// Update display
[[window contentView] display];
[window display];
}
...并在Matlab中将代码编译为:
mex create_window.c -v CFLAGS='$CFLAGS -ObjC++' LDFLAGS='$LDFLAGS -framework Cocoa -framework Foundation -framework AppKit'
这将编译并运行,如果您探测了NSWindow对象,它说它是可见的。但是,屏幕上没有任何显示。我的猜测是NSWindow或NSView不会持久存在,但是我一直无法解决此问题。
同样,如果其他人使用OpenGL为窗口生成上下文,这应该是可能的。
任何帮助将不胜感激!