macos - Delphi OS X 子类 NSWindow 无边框,带鼠标事件

标签 macos cocoa delphi firemonkey nswindow

如何在delphi firemonkey中创建NSWindow的派生类? 我已经成功创建了一个仅包含 Web View 的 Cocoa 窗口。 (使用 NSWindow.Wrap、setContentView、orderFront 等) 我将其设置为无边框,但问题是它不接受鼠标移动事件,如下所述: Why NSWindow without styleMask:NSTitledWindowMask can not be keyWindow?

是否可以在delphi中子类化NSWindow并覆盖canBecomeKeyWindow?

它不起作用(编译,但未调用方法):

type
 TMYNSWindow = class(TNSWindow)
   function canBecomeKeyWindow: Boolean; cdecl;
 end;
 function TMYNSWindow.canBecomeKeyWindow: Boolean;
 begin
   Result := true;
end;

`

这也无效:

TMYNSWindow = class(TOCGenericImport<NSWindowClass, NSWindow>) function canBecomeKeyWindow: Boolean; cdecl; end;

那么,我如何子类化 NSWindow 并重写其方法之一?

编辑

使用塞巴斯蒂安的解决方案后, 要实际创建窗口,您可以使用如下内容:

  constructor TMYNSWindow.Create( contentRect: NSRect; styleMask: NSUInteger; backing: NSBackingStoreType; defer: Boolean );
  var
    V : Pointer;
  begin
    inherited Create;
    V := NSWindow(Super).initWithContentRect( contentRect, styleMask, backing, defer );
    if GetObjectID <> V then UpdateObjectID(V);
  end;


var
  MyNSW : TMyNSWindow;
  NSW : NSWindow;

...

  MyNSW := TMyNSWindow.Create(
    MakeNSRect(0, 0, 600, 400),
    NSBorderlessWindowMask
    //NSClosableWindowMask or NSMiniaturizableWindowMask or NSResizableWindowMask
    ,NSBackingStoreBuffered, false );

  MyNSW.Super.QueryInterface( StringToGUID(GUID_NSWINDOW), NSW );   //GUID_NSWINDOW = '{8CDBAC20-6E46-4618-A33F-229394B70A6D}';
  NSW.setFrame( R, true, true );  // R is NSRect, fill it before...
  NSW.orderFront((TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication) as ILocalObject).GetObjectID );

最佳答案

这是一个从 Cocoa 类派生的简单示例。

unit Unit2;

interface

uses
  MacApi.AppKit, Macapi.ObjectiveC, System.TypInfo;

type
  MyNSWindow = interface(NSWindow)
    // Press Ctrl+Shift+G to insert a unique guid here
    function canBecomeKeyWindow: Boolean; cdecl;
  end;

  TMyNSWindow = class(TOCLocal)
  protected
    function GetObjectiveCClass: PTypeInfo; override;
  public
    function canBecomeKeyWindow: Boolean; cdecl;
    constructor Create;
  end;

implementation

{ TMyNSWindow }

function TMyNSWindow.canBecomeKeyWindow: Boolean;
begin
  Result := True;
end;

constructor TMyNSWindow.Create;
var
  V: Pointer;
begin
  inherited Create;
  V := NSWindow(Super).init;
  if GetObjectID <> V then
    UpdateObjectID(V);
end;

function TMyNSWindow.GetObjectiveCClass: PTypeInfo;
begin
  Result := TypeInfo(MyNSWindow);
end;


end.

关于macos - Delphi OS X 子类 NSWindow 无边框,带鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26399749/

相关文章:

objective-c - Cocoa 中的多行 PDFAnnotationTextWidget

macos - 在Mac上编辑PATH变量

reactjs - macOS Catalina 上的 Node-sass 不起作用。我应该如何解决这个问题?

objective-c - 按钮单击事件导致 MAC 应用程序崩溃

objective-c - 有人可以解释 Objective-C 中的函数名称吗?

delphi - TOpenDialog 和空间

delphi - Delphi 的语言补充

macos - PhpStorm - 输入越南语时出错

windows - Cocoa、Windows 和线程?

delphi - 如何在TDBCtrlGrid中设置PanelHeight?