Подтвердить что ты не робот

Что делает 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, он уверен, что там происходит какой-либо "рисунок"? Может ли кто-нибудь объяснить это лучше?

4b9b3361

Ответ 1

Для рисования требуется "графический контекст". Вы заметите, что в отличие от Core Graphics ни один из методов рисования AppKit не принимает параметр, указывающий, где заканчивается чертеж. Вместо этого адресат хранится глобально как [NSGraphicsContext currentContext]. Все методы рисования AppKit влияют на текущий контекст.

Основная цель -lockFocus (как для изображений, так и для просмотра) - настроить графический контекст, чтобы ваш рисунок заканчивался тем, где вы хотите.

Ответ 2

Из документов для -[NSImage lockFocus]:

Этот метод устанавливает текущий контекст чертежа в область заставки, используемого для кэширования содержимого приемника.

Итак, существует окно, которое вы нарисовываете, когда рисуете изображение. Это изображение имеет графический контекст, а lockFocus делает этот контекст текущим контекстом рисования, так что drawInRect:... использует его для его рисования. Он похож на +[NSGraphicsContext setCurrentContext].