Почему вызов BeginPaint () всегда генерирует сообщение WM_NCPAINT? - PullRequest
2 голосов
/ 19 сентября 2008

У меня проблема с Win32 API. У меня есть программа, которая, когда она обрабатывает WM_PAINT сообщения, вызывает BeginPaint, чтобы обрезать регион и проверять область обновления, но функция BeginPaint всегда генерирует сообщение WM_NCPAINT с той же областью обновления, даже если затронутая часть, которая нуждается в перекраске, находится только внутри клиентской области.

Кто-нибудь знает, почему это происходит? На дочерних окнах в стиле WS_CHILD.

Ответы [ 3 ]

1 голос
/ 19 сентября 2008

Запись MSDN для WM_PAINT гласит:

Функция может также отправлять сообщение WM_NCPAINT оконной процедуре, если оконная рама должна быть окрашена, и отправляет сообщение WM_ERASEBKGND, если фон окна должен быть удален.

Я пытаюсь выяснить, почему он всегда отправляет, даже если граница не затронута. Я проверяю это, открывая маленький Блокнот внутри элемента управления и минимизируя. Он не касается границ элемента управления, только внутри, и BeginPaint() генерирует WM_NCPAINT.

0 голосов
/ 19 сентября 2008

Что произойдет, если вы вызовете SetWindowPos и передадите SWP_DEFERERASE в качестве аргумента для параметра uFlags?

Это должно предотвратить генерацию сообщения WM_SYNCPAINT, что косвенно приведет к отправке сообщения WM_NCPAINT.

0 голосов
/ 19 сентября 2008

Я полагаю, что сообщение WM_NCPAINT всегда отправляется с предположением, что границу также необходимо перекрасить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...