2015-11-04 3 views
1

У меня есть два метода, которые изменяют отображение экрана. Есть ли способ заморозить экран, пока не будет вызван второй метод?Замораживание OS X Экран в какао

// I want to freeze the screen here 
updateDisplay1(); // Change in display doesn't take effect until screen is unfrozen 
updateDisplay2(); 
// Unfreeze screen here 

В Excel VBA это будет что-то вроде screenUpdating = FALSE. Есть ли аналогичная функция в какао?

Одним из возможных способов это взять скриншот:

// Take screenshot of the screen 
// Display the screenshot image in front of the screen 
updateDisplay1(); // Change is not visible 
updateDisplay2(); 
// Remove screenshot image 

Но я боюсь, что это медленно и занимает много памяти. Есть ли более эффективный метод?

+0

Ваша тема сбивает с толку и вводит в заблуждение. Если вы говорите «отображение экрана», то большинство из них должно быть связано с тем, что вы говорите о экране монитора. –

+0

Мой английский не очень хороший, извините. Но мой вопрос очень легко понять, не так ли? Я просто хочу знать, как заморозить то, что отображается на экране. – user5498580

+1

Существует функция 'NSDisableScreenUpdates', но она работает только с окнами, принадлежащими вашему процессу. Поэтому, если вы используете Accessibility для управления другим процессом, это не сработает. – JWWalker

ответ

0

На каком экране вы говорите?

поведения

Стандарт Какао:

  1. обновить свойства различных видов, которые вы заинтересованы в;
  2. каждый из них позвонит самостоятельно setNeedsDisplayInRect. В результате этих вызовов перерисовка будет запланирована в цикле запуска;
  3. После того, как вы закончите делать все ваши обновления, цикл выполнения сможет перейти к следующему элементу;
  4. в конечном итоге он достигнет перерисовки, которую он запланировал, и сделает соответствующие drawRect звонки в соответствующие виды.

Так что все изменения вида, которые вы делаете в ответ на действие, автоматически атомарны. Вы должны значительно отказаться от своего собственного способа создания частичного обновления.

+0

Я использую API Accessibility для изменения размеров и перестановки окон. Невозможно изменить размер и позицию одновременно. Экран обновляется дважды (сначала изменяется размер окна, а затем перемещается). – user5498580

+0

Пожалуйста, разместите вызовы в API Accessibility, который вы используете; это важная информация на вопрос! Вы не можете ожидать, что люди будут читать ваши мысли. – bhaller

+0

Я ожидал ответа, который замораживает экран независимо от того, что происходит, когда экран застыл, вызов API Accessibility или что-то еще. В любом случае, вызов AXUIElementCopyAttributeValue (myAXWindowElement, kAXPositionAttribute, myTargetPosition) – user5498580

0

снятие скриншотов с CGWindowListCreateImage занимает несколько миллисекунд и использует примерно любую память. это обычно делается непосредственно на графической карте.

дать ему попробовать и меры, прежде чем делать какие-либо предположения производительности :-)

+0

Я пробовал это и столкнулся с проблемой. Итак, последовательность: (1) получить скриншот, (2) поместить скриншот, покрывающий экран, (3) выполнить первое обновление экрана, (4) выполнить второе обновление экрана, (5) удалить снимок экрана. Но кажется, что шаг (2) слишком медленный, так что, когда я запускал код, порядок выглядит как 1-3-4-2-5. Есть ли способ предотвратить (3) и (4) от запуска до (2) завершения? – user5498580

+0

Мне удалось заставить его работать после нескольких проб и ошибок. Это по-прежнему мало для моей цели, но, по крайней мере, это работает. – user5498580

+0

@ user5498580 Помог ли вам этот ответ? если да, вы хотели бы принять его, используя зеленую галочку, оставшуюся до моего ответа? –

Смежные вопросы