что недействительно, методы обновления делают в VC ++ - PullRequest
6 голосов
/ 02 февраля 2010

У меня есть небольшое сомнение относительно оконных функций в C ++. что именно делает "invalidate()" функция? какое сообщение он отправляет? когда нам нужно это назвать? и что такое "update()" функция? "invalidaterect()" работает аналогично функции "invalidate()"?

Спасибо

Ответы [ 2 ]

7 голосов
/ 02 февраля 2010

CWnd::Invalidate() делает недействительной всю клиентскую область окна, что указывает на то, что эта область устарела и должна быть перекрашена. Обычно вы вызываете это для элемента управления, который необходимо перерисовать. CWnd::InvalidateRect() делает недействительной только часть окна.

При использовании функций Invalidate сообщение WM_PAINT будет опубликовано [ не совсем верно; см. комментарии ] к очереди сообщений и обрабатываются в какой-то момент в будущем. CWnd::UpdateWindow() отправляет (в отличие от сообщений) сообщение WM_PAINT, в результате чего недействительные области немедленно перерисовываются.

Действительно, это все в документах.

1 голос
/ 02 февраля 2010

Функция invalidate помечает область рисования как недействительную. Этот флаг используется, когда окно перерисовывается, если область становится недействительной, она перерисовывает область, если нет, она просто покидает область экрана как есть. invalidate делает недействительной всю клиентскую область данного объекта, invalidaterect делает недействительной конкретную область клиентской области. Функция обновления выполняет фактическую перерисовку.

Причина такого механизма, а не просто рисования сразу, когда вы знаете, что что-то должно быть изменено, заключается в том, что вы можете предотвратить несколько перерисовок, скажем, например, вы получили три сообщения нажатия клавиш за один раз, прокручивая некоторую текстовую область. Если вы перерисовываете текстовую область для каждого из нажатий клавиш, вам придется рисовать текстовую область три раза, и приложение перестает отвечать на запросы. Вместо этого, обрабатывая все ключевые события, обновляя структуру данных, прикрепленную к текстовой области, и делая текстовую область недействительной перед перерисовкой текстовой области, вы перерисовываете текстовую область только один раз.

...