Что делает lockFocus и unlockFocus на самом деле?
Предупреждение: я новичок Cocoa.
Я читаю "Cocoa Программирование для Mac OS X" от Hillegass.
На стр .301 написано:
Чтобы рисунок появился на изображении, а не на экране, вы должны сначала заблокировать фокус на изображении. Когда чертеж завершен, вы должны разблокировать фокус.
Код, который у меня есть, внутри -(void)mouseDragged:(NSEvent *)theEvent
для NSView
выглядит следующим образом:
[resizedImage lockFocus];
[sourceImage drawInRect: NSMakeRect(0, 0, resizeWidth, resizeHeight) fromRect: NSMakeRect(0, 0, originalSize.width, originalSize.height) operation: NSCompositeSourceOver fraction: 1.0];
[resizedImage unlockFocus];
Без блокировки/разблокировки это не сработает, но я до сих пор не понимаю, что происходит.
Я вижу, что в 2-й строке кода нет упоминания о resizedImage
, значит ли это, когда я использую lockFocus
, он уверен, что там происходит какой-либо "рисунок"? Может ли кто-нибудь объяснить это лучше?
Ответы
Ответ 1
Для рисования требуется "графический контекст". Вы заметите, что в отличие от Core Graphics ни один из методов рисования AppKit не принимает параметр, указывающий, где заканчивается чертеж. Вместо этого адресат хранится глобально как [NSGraphicsContext currentContext]
. Все методы рисования AppKit влияют на текущий контекст.
Основная цель -lockFocus
(как для изображений, так и для просмотра) - настроить графический контекст, чтобы ваш рисунок заканчивался тем, где вы хотите.
Ответ 2
Из документов для -[NSImage lockFocus]
:
Этот метод устанавливает текущий контекст чертежа в область заставки, используемого для кэширования содержимого приемника.
Итак, существует окно, которое вы нарисовываете, когда рисуете изображение. Это изображение имеет графический контекст, а lockFocus
делает этот контекст текущим контекстом рисования, так что drawInRect:...
использует его для его рисования. Он похож на +[NSGraphicsContext setCurrentContext]
.