【问题标题】:Delphi OS X subclass NSWindow borderless with mouse eventsDelphi OS X 子类 NSWindow 无边界鼠标事件
【发布时间】:2014-10-16 08:36:12
【问题描述】:

如何在delphi firemonkey中创建NSWindow的派生类? 我已经成功创建了一个只包含一个 webview 的 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 );

【问题讨论】:

    标签: macos cocoa delphi firemonkey nswindow


    【解决方案1】:

    这是一个从 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.
    

    【讨论】:

    • 非常感谢,完美运行。我编辑了我的问题以显示实际的实例化和使用,我希望这是一个很好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    相关资源
    最近更新 更多