我有一个CGContext,我可以把它变成一个NSGraphicsContext。 我有一个NSWindow,上面有一个clipRect。
我想将一个scrollview放入上下文,然后将一些其他视图放入scrollview中,这样我就可以将一个图像放入其中......但是,我无法弄清楚如何将scrollview附加到上下文中。
最终视图可能来自笔尖,但我不明白这是怎么回事。
我已经看过这个帖子,(http://lists.apple.com/archives/quartz-dev/2006/Nov/msg00010.html)但是他们似乎没有把视图附加到上下文中的步骤,除非有一些明显我缺失的东西。
编辑:
我遇到这种情况的原因是我正在编写一个Mozilla插件。浏览器给我一个CGContext(Quartz)和一个WindowRef(QuickDraw)。我可以将CGContext转换为NSGraphicsContext,然后我可以将windowRef转换为NSWindow。从另一个数据结构我也有剪切矩形......
我正在尝试将图像绘制到该上下文中,根据需要使用滚动条,按钮和其他UI元素......所以我需要(想要)一个NSView ...
答案 0 :(得分:0)
您无法将视图放入图形上下文中。视图可以进入另一个视图,也可以作为窗口的内容视图。
您可以通过将该上下文设置为当前上下文并告知视图绘制来将视图绘制到上下文中。您可能这样做是为了将视图呈现给图像,但除此之外,我无法想到这样做的理由。 (编辑:好的,作为Netscape插件可能是一个很好的理由。)
通常,视图在NSView的lockFocus
方法实现中获得自己的图形上下文,display
由displayIfNeeded
为您调用,{{1}}为您调用(仅限于{{1}}显然需要显示视图,这是作为事件循环的一部分调用的。
除非在极少数情况下,例如我提到的导出到图像的情况,否则您不需要为视图创建上下文。通常情况下,你让视图自己处理。
答案 1 :(得分:0)
部分解决方案?
我目前所做的是在NSScrollView内的IKImageView中使用按钮创建一个笔尖。我在我的插件中加载它。
然后,由于我有NSWindow,我可以获得窗口的contentView。然后,我将scrollview添加为contentView的子视图。
看来,但似乎存在一些关于原点位置的坐标混淆。 (顶部与底部)因为我正在弄脏整个窗口的内容视图,我正在做一些非常全局的东西,也许我应该在本地做更多。就像,即使关闭选项卡或转到另一个选项卡,视图也不会消失。 (当你关闭窗口时它会关闭)
那么,这听起来像是一种合理的方式吗?感觉有点...... kludgy ......
答案 2 :(得分:0)
对于后代(当我忘记我是如何做到这一点而谷歌引导我回到我自己的问题时),以下是我如何做到这一点:
我有一个带有我所有观点的NIB,我在启动时加载它。
在SetWindow上,我设置剪辑rect并实际执行附加:NP_CGContext* npContext = (NP_CGContext*) window->window;
NSWindow* browserWindow = [[[NSWindow alloc] initWithWindowRef:npContext->window] autorelease];
NSView* cView = [browserWindow contentView];
NSView* hitView = [cView hitTest:NSMakePoint(window->x + 1, clip.origin.y + 1)];
if (hitView == nil || ![[hitView className] isEqualToString:@"ChildView"])
{
return;
}
superView = [hitView retain];
[superView addSubview: topView];
[superView setNextResponder: topView];
[topView setNextResponder: nil];
[browserWindow makeFirstResponder: topView];
为了确保我只添加一次SubView,我有一个标志......
然后在handleEvent中,我实际绘制,因为我使用的是IKImageView,我可以使用未记录的方法:[imageView setImage:image];这需要一个NSImage。
到目前为止,这似乎对我有用。希望这有助于其他人。