2008-09-19 3 views
2

Win32 API에 문제가 있습니다. 나는 WM_PAINT 메시지를 처리 ​​할 때 BeginPaint을 호출하여 영역을 클리핑하고 업데이트 영역의 유효성을 검사하지만, 다시 칠할 필요가있는 터치 된 부분이있는 경우에도 BeginPaint 함수는 항상 동일한 업데이트 영역을 사용하여 WM_NCPAINT 메시지를 생성합니다. 클라이언트 영역 내부에서만BeginPaint()에 대한 호출이 항상 WM_NCPAINT 메시지를 생성하는 이유는 무엇입니까?

누구에게 이런 일이 일어나는지 실마리가 있습니까? WS_CHILD 스타일의 하위 창에 있습니다.

+0

왜 이것이 문제를 일으키는 지 자세히 설명해 주실 수 있습니까? –

+0

프레임이 지저분하지 않은 경우에도 프레임을 다시 그리기 때문에 성능이 향상됩니다. 일종의 CSS 상자 모델로 설정된 위젯이 있고 프레임을 사용하여 여백, 테두리 및 패딩을 수행합니다. –

답변

0

국경이 다시 칠해야한다는 가정하에 WM_NCPAINT 메시지가 항상 전송됩니다.

1

WM_PAINT에 대한 MSDN 항목은 말한다 :

기능 또한 창 프레임 그린해야하는 경우 윈도우 프로 시저에 WM_NCPAINT 메시지를 보내고 WM_ERASEBKGND 메시지를 보낼 수있는 창 배경을 삭제해야하는 경우 .

저는 국경에 손을 대지 않아도 항상 보내는 이유를 알아 내려고하고 있습니다. 나는 컨트롤 안에 작은 메모장을 열고 최소화하는 것을 테스트한다. 그것은 내부의 컨트롤의 경계를 만지지 않으며 BeginPaint()WM_NCPAINT을 생성합니다.

0

uFlags 매개 변수에 SetWindowPos을 호출하고 SWP_DEFERERASE을 인수로 전달하면 어떻게됩니까?

이렇게하면 메시지가 생성되지 않으므로 간접적으로 WM_NCPAINT 메시지가 전송됩니다.

+0

윈도우 메시지 스파이가 WM_SYNCPAINT가 생성되지 않고 있음을 보여줍니다. 창문이 더러워 졌을 때 문제가 발생합니다 (무언가가 넘쳐서 사라 졌을 때 다시 그리기가 필요함). BeginPaint()를 잊어 DC를 얻고 "손으로"영역을 확인하려고합니다. –

관련 문제