Откройте NSWindow, используя MEX-файл, который появляется на экране - PullRequest
0 голосов
/ 17 ноября 2018

После многих часов исследований я не могу найти ответ, который адекватно отвечает на этот вопрос, хотя я и близко подошел.

Моя основная задача - сгенерировать MEX-функцию для Matlab, которая создает NSWindow с NSView, который появляется на экране. Это включает создание гибридного файла Obj-C ++ во время компиляции, что было сделано ранее, так что это не проблема.

Тем не менее, все реализации, с которыми я сталкивался, основаны на библиотеках OpenGL, которые я хочу избегать. Библиотеки OpenGL обычно используются для генерации контекста, но здесь я просто хочу, чтобы простой 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 для генерации контекста для окна.

Любая помощь будет принята с благодарностью!

...