【问题标题】:how to create a windowed plug-in?如何创建窗口化插件?
【发布时间】:2012-09-19 10:12:35
【问题描述】:

我使用 NPAPI 创建了一个 safari 插件,我想在我的插件中添加一个 NSView。

当我尝试获取NPWindow throw函数NPP_SetWindow(NPP instance, NPWindow* window)时,第二个参数为nil。

我认为我的插件是无窗口的,但我不知道如何创建窗口。

【问题讨论】:

    标签: npapi browser-plugin windowless windowed


    【解决方案1】:

    Mac 上的 NPAPI 不支持将 NSView 作为窗口模式。有两种支持的模式:

    以前有 QuickDraw 模式,但已弃用。

    有关详细信息,请参阅Stuart Morgan's excellent blog post on the subject

    可以将 NSView 渲染到 CoreGraphics 上下文,但您必须代理所有事件,这远非完美。

    编辑:为了进一步解释您的问题的答案,window 参数为 NULL 的原因(它是 C api,而不是 Obj C,所以它是 NULL,而不是 nil...尽管有它们是同一件事 =]) 是因为在 Cocoa Event Model 中,您会获得一个 CGContextRef 作为 draw event 的一部分,这仅在该事件的上下文中有效。

    【讨论】:

    • 你好@taxilian!我想知道为什么第二个参数“window”是nil?我从苹果开发者文档中找到下面的代码,但现在它不能工作。我错过了什么吗? NPError setwindow_cb(NPP instance, NPWindow* npw) { ... NP_CGContext *npcontext = npw.window; CGContextRef 上下文 = npcontext.context; CGRect boundingBox = CGContextGetClipBoundingBox(context);
    • 您错过了对 cocoa 的更新,此时窗口现在为 NULL,并且您将 CGContextRef 作为事件的一部分。见wiki.mozilla.org/NPAPI:CocoaEventModel
    • 非常感谢出租车司机。**NPWindow**对我来说很重要,因为我的播放器是通过我的插件中的导出功能void SetHwnd(void *hWnd, CGRect rect)创建的。如果只有CGContextRef可以使用,我应该重写一个新函数吗?
    • 如果您当前的代码要求 CGContextRef 来自 NPWindow 而不是作为 Cocoa NPEvent 的一部分,那么是的,您将不得不重写一些代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多