이중 버퍼링을 사용해야하는 경우 WM_ERASEBKGND
메시지를 표시하지 않아야합니다.WM_ERASEBKGND를 억제하는 올바른 방법은 무엇입니까?
나는 WM_ERASEBKGND
을 처리하고 즉시 반환 할 수 있습니다. 그러나 WNDCLASS
/WNDCLASSEX
의 hbrBackground
을 NULL
으로 설정하고 WM_ERASEBKGND
메시지를 처리 할 수 있습니까? 이것이 올바른 방법입니까?
이중 버퍼링을 사용해야하는 경우 WM_ERASEBKGND
메시지를 표시하지 않아야합니다.WM_ERASEBKGND를 억제하는 올바른 방법은 무엇입니까?
나는 WM_ERASEBKGND
을 처리하고 즉시 반환 할 수 있습니다. 그러나 WNDCLASS
/WNDCLASSEX
의 hbrBackground
을 NULL
으로 설정하고 WM_ERASEBKGND
메시지를 처리 할 수 있습니까? 이것이 올바른 방법입니까?
예, no처리기를 구현하지 않으려면 hbrBackground
에서 NULL
으로 설정하는 것이 좋습니다.
WM_ERASEBKGND
을 DefWindowProc
에 전달하면 창 클래스의 배경 브러시를 확인합니다. 하나가 있으면 더러운 영역을 채 웁니다. 배경 브러시가 null이면 아무것도 수행하지 않고 반환합니다. 이는 본질적으로 자신이 아무것도하지 않는 것과 같습니다. WM_ERASEBKGND
처리기입니다.
WM_ERASEBKGND
핸들러의 리턴 값의 fErase
필드에 영향을 미치는 PAINTSTRUCT
당신이 얻을 때 WM_PAINT
통화 BeginPaint
. WM_PAINT
처리기는 fErase
을 확인하여 배경 자체를 지워야하는지 여부 또는 이미 완료된 경우 WM_ERASEBKGND
인지 확인해야합니다. (비록 내가 실제로 그것을 본 사람은 본 적이 없지만). DefWindowProc
을으로 처리하게하면, 색 번호 나 브러시가 있으면 TRUE
을, hbrBackground
이면 인 경우 FALSE
을 반환합니다.
나는 hbrBackground = GetStockObject(HOLLOW_BRUSH)
을 NULL
으로 설정하는 것보다 더 정확하다고 생각합니다. 당신이 자동으로 배경 그림을 원하지 않는 경우
는 다음 중공 브러시를 전달합니다
An article on Raymond Chen's The Old New Thing는 구별을합니다. 사용자 정의 배경 그림을 원하면
NULL
을 브러시로 전달하십시오.
The MSDN documentation for WNDCLASS
의 hbrBackground
회원은 말한다 :이 멤버는 NULL
경우가 클라이언트 영역에 페인트를 요청할 때마다
이 응용 프로그램은 자신의 배경을 칠해야합니다. 배경을 그려야하는지 여부를 결정하려면 응용 프로그램에서
WM_ERASEBKGND
메시지를 처리하거나 함수로 채워진PAINTSTRUCT
구조의 구성원 인fErase
을 테스트 할 수 있습니다.
그리고 MSDN documentation for WM_ERASEBKGND
는 말한다 :
DefWindowProc
기능은WNDCLASS
구조의hbrBackground
구성원에 의해 지정된 클래스 배경 브러시를 사용하여 배경을 지 웁니다.hbrBackground
이NULL
인 경우 응용 프로그램에서메시지를 처리하고 배경을 지워야합니다.
내 해석은 다음 NULL
에 hbrBackground
을 설정하고 (그러나 아마 작동) 엄격하게 법적으로 의미되지 WM_ERASEBKGND
을 처리하기 위해 무시한다는 것입니다; hbrBackground = NULL
는 WM_ERASEBKGND
직접 처리하고 널 포인터와 페인트 DefWindowProc
시도를 못하게 약속입니다. 당신이
나는 당신이 그것을 분석하는 것 같아. hbrBackground를 NULL로 설정하는 것은 올바른 일을합니다. WM_ERASEBKGND를 처리하여 배경을 채울 수도 있고 WM_PAINT로 처리 할 수도 있습니다. WM_ERASEBKGND에 대한 DefWindowProc은 브러시 (또는 색상)가 지정되어 있고 영역을 채우면 TRUE를 반환합니다. hbrBackground가 NULL이면 FALSE를 리턴합니다. 해로움. –
저는 BeginPaint에서 얻은 PAINTSTRUCT의 fErase 멤버에 어떤 차이가 있는지 생각합니다. 빈 브러시를 선택하면 기본 WM_ERASEBKGND 핸들러가 빈 브러시로 채워지고 TRUE를 반환합니다 (배경이 지워짐을 의미). 이로 인해 fErase 멤버가 FALSE가되어 나머지 WM_PAINT 핸들러가 속임을 당하지 않습니다 일에 그것은 자신의 지우기입니다. 당신이 NULL이있는 경우, 기본 WM_ERASEBKGND 처리기가 아무것도하지 않고 fErase 아래 fErase 멤버가 TRUE로. PAINTSTRUCT에 대한 문서에서 –
원인 ("나는 배경을 삭제하지 않았다") FALSE 반환 그것은 말합니다 : "응용 프로그램은 배경 브러시없이 윈도우 클래스가 생성되면 배경을 지우는 책임이 있습니다."따라서 백 브러시가 전혀없는 것이 합법적입니다. "응용 프로그램"은 WM_PAINT 핸들러를 참조합니다. BeginPaint에서 PAINTSTRUCT를 얻는 순간, WM_ERASEBKGND가 왔고 사라졌습니다. 그래, 당신은 여전히 배경을 페인팅 할 책임이 있지만, WM_PAINT 핸들러는 그것을 수행하기위한 합법적 인 장소입니다. –
주 __still__는 다음'WM_ERASEBKGND'를 보냈다. 차이점은 처리하지 않으면 아무 일도 일어나지 않습니다 (무시할 수 있음). – Damon
이것이 정결 법이라고 확신합니까? 'NULL'과 빈 브러시를 사용하는 것 사이에 [Raymond Chen이 구별되는 것 같습니다] (https://blogs.msdn.microsoft.com/oldnewthing/20140305-00/?p=1593/)를 아십니까? – jamesdlin
네, 그것은 정결합니다. 'hbrBackground' 중 MSDN은 "이 멤버가 NULL 일 때 응용 프로그램은 클라이언트 영역에 페인트를 요청할 때마다 자체 배경을 페인트해야합니다." 내가 의미 –