使用屏幕上显示的MEX文件打开NSWindow

时间:2018-11-16 21:04:18

标签: macos matlab cocoa mex nswindow

经过数小时的研究,尽管我已经接近了,但我找不到合适的答案。

我的基本需求是为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为窗口生成上下文,这应该是可能的。

任何帮助将不胜感激!

0 个答案:

没有答案