2012-08-22 1 views
3

이중 버퍼링을 사용해야하는 경우 WM_ERASEBKGND 메시지를 표시하지 않아야합니다.WM_ERASEBKGND를 억제하는 올바른 방법은 무엇입니까?

나는 WM_ERASEBKGND을 처리하고 즉시 반환 할 수 있습니다. 그러나 WNDCLASS/WNDCLASSEXhbrBackgroundNULL으로 설정하고 WM_ERASEBKGND 메시지를 처리 ​​할 수 ​​있습니까? 이것이 올바른 방법입니까?

답변

5

예, no처리기를 구현하지 않으려면 hbrBackground에서 NULL으로 설정하는 것이 좋습니다.

WM_ERASEBKGNDDefWindowProc에 전달하면 창 클래스의 배경 브러시를 확인합니다. 하나가 있으면 더러운 영역을 채 웁니다. 배경 브러시가 null이면 아무것도 수행하지 않고 반환합니다. 이는 본질적으로 자신이 아무것도하지 않는 것과 같습니다. WM_ERASEBKGND 처리기입니다.

WM_ERASEBKGND 핸들러의 리턴 값의 fErase 필드에 영향을 미치는 PAINTSTRUCT 당신이 얻을 때 WM_PAINT 통화 BeginPaint. WM_PAINT 처리기는 fErase을 확인하여 배경 자체를 지워야하는지 여부 또는 이미 완료된 경우 WM_ERASEBKGND인지 확인해야합니다. (비록 내가 실제로 그것을 본 사람은 본 적이 없지만). DefWindowProc을으로 처리하게하면, 색 번호 나 브러시가 있으면 TRUE을, hbrBackground이면 인 경우 FALSE을 반환합니다.

+2

주 __still__는 다음'WM_ERASEBKGND'를 보냈다. 차이점은 처리하지 않으면 아무 일도 일어나지 않습니다 (무시할 수 있음). – Damon

+0

이것이 정결 법이라고 확신합니까? 'NULL'과 빈 브러시를 사용하는 것 사이에 [Raymond Chen이 구별되는 것 같습니다] (https://blogs.msdn.microsoft.com/oldnewthing/20140305-00/?p=1593/)를 아십니까? – jamesdlin

+0

네, 그것은 정결합니다. 'hbrBackground' 중 MSDN은 "이 멤버가 NULL 일 때 응용 프로그램은 클라이언트 영역에 페인트를 요청할 때마다 자체 배경을 페인트해야합니다." 내가 의미 –

1

나는 hbrBackground = GetStockObject(HOLLOW_BRUSH)NULL으로 설정하는 것보다 더 정확하다고 생각합니다. 당신이 자동으로 배경 그림을 원하지 않는 경우

는 다음 중공 브러시를 전달합니다

An article on Raymond Chen's The Old New Thing는 구별을합니다. 사용자 정의 배경 그림을 원하면 NULL을 브러시로 전달하십시오.

The MSDN documentation for WNDCLASShbrBackground 회원은 말한다 :이 멤버는 NULL 경우가 클라이언트 영역에 페인트를 요청할 때마다

이 응용 프로그램은 자신의 배경을 칠해야합니다. 배경을 그려야하는지 여부를 결정하려면 응용 프로그램에서 WM_ERASEBKGND 메시지를 처리하거나 함수로 채워진 PAINTSTRUCT 구조의 구성원 인 fErase을 테스트 할 수 있습니다.

그리고 MSDN documentation for WM_ERASEBKGND는 말한다 :

DefWindowProc 기능은 WNDCLASS 구조의 hbrBackground 구성원에 의해 지정된 클래스 배경 브러시를 사용하여 배경을 지 웁니다. hbrBackgroundNULL 인 경우 응용 프로그램에서메시지를 처리하고 배경을 지워야합니다.

내 해석은 다음 NULLhbrBackground을 설정하고 (그러나 아마 작동) 엄격하게 법적으로 의미되지 WM_ERASEBKGND을 처리하기 위해 무시한다는 것입니다; hbrBackground = NULLWM_ERASEBKGND 직접 처리하고 널 포인터와 페인트 DefWindowProc 시도를 못하게 약속입니다. 당신이

+0

나는 당신이 그것을 분석하는 것 같아. hbrBackground를 NULL로 설정하는 것은 올바른 일을합니다. WM_ERASEBKGND를 처리하여 배경을 채울 수도 있고 WM_PAINT로 처리 할 수도 있습니다. WM_ERASEBKGND에 대한 DefWindowProc은 브러시 (또는 색상)가 지정되어 있고 영역을 채우면 TRUE를 반환합니다. hbrBackground가 NULL이면 FALSE를 리턴합니다. 해로움. –

+1

저는 BeginPaint에서 얻은 PAINTSTRUCT의 fErase 멤버에 어떤 차이가 있는지 생각합니다. 빈 브러시를 선택하면 기본 WM_ERASEBKGND 핸들러가 빈 브러시로 채워지고 TRUE를 반환합니다 (배경이 지워짐을 의미). 이로 인해 fErase 멤버가 FALSE가되어 나머지 WM_PAINT 핸들러가 속임을 당하지 않습니다 일에 그것은 자신의 지우기입니다. 당신이 NULL이있는 경우, 기본 WM_ERASEBKGND 처리기가 아무것도하지 않고 fErase 아래 fErase 멤버가 TRUE로. PAINTSTRUCT에 대한 문서에서 –

+1

원인 ("나는 배경을 삭제하지 않았다") FALSE 반환 그것은 말합니다 : "응용 프로그램은 배경 브러시없이 윈도우 클래스가 생성되면 배경을 지우는 책임이 있습니다."따라서 백 브러시가 전혀없는 것이 합법적입니다. "응용 프로그램"은 WM_PAINT 핸들러를 참조합니다. BeginPaint에서 PAINTSTRUCT를 얻는 순간, WM_ERASEBKGND가 왔고 사라졌습니다. 그래, 당신은 여전히 ​​배경을 페인팅 할 책임이 있지만, WM_PAINT 핸들러는 그것을 수행하기위한 합법적 인 장소입니다. –