lockFocus和unlockFocus实际上做了什么?

Vam*_*mos 12 cocoa drawing

警告:我是Cocoa的新手.

我正在阅读Hillegass的"Cocoa Programming For Mac OS X".

在p.301上写道:

要使图形显示在图像上而不是屏幕上,必须先将焦点锁定在图像上.绘图完成后,您必须解锁焦点.

我的代码,里面-(void)mouseDragged:(NSEvent *)theEventNSView情况如下:

[resizedImage lockFocus];
[sourceImage drawInRect: NSMakeRect(0, 0, resizeWidth, resizeHeight) fromRect: NSMakeRect(0, 0, originalSize.width, originalSize.height) operation: NSCompositeSourceOver fraction: 1.0];
[resizedImage unlockFocus];
Run Code Online (Sandbox Code Playgroud)

没有锁定/解锁,这不起作用,但我仍然不明白究竟发生了什么.

我看到第二行代码没有提及,resizedImage这意味着当我使用lockFocus它时确保发生的任何"绘图"发生在那里?有人能更好地解释一下吗?

kpe*_*yua 18

绘图需要'图形上下文'.您会注意到,与Core Graphics不同,AppKit绘图方法都没有采用指定绘图最终位置的参数.而是将目的地全局存储为[NSGraphicsContext currentContext].所有AppKit绘图方法都会影响当前上下文.

-lockFocus(在图像和视图上)的主要目的是设置图形上下文,以便您的绘图最终到达您想要的位置.

  • 值得注意的是,这些堆栈,例如,在视图的'drawRect:`(在`lockFocus`和`unlockFocus`之间运行到视图)中执行此操作是安全的. (3认同)

Ole*_*ann 6

来自以下文档-[NSImage lockFocus]:

此方法将当前绘图上下文设置为用于缓存接收方内容的屏幕外窗口区域.

因此,当您绘制到图像时,会出现一个屏幕外窗口.此图像具有图形上下文,lockFocus并使此上下文成为当前图形上下文,以便drawInRect:...将其用于绘图.它类似于+[NSGraphicsContext setCurrentContext].