Windows에서 WM_ERASEBKGND를 처리하는 동안 깜박임을 피하는 방법 대화 상자

StackOverflow https://stackoverflow.com/questions/164751

문제

크기를 조정하는 대화 상자가 있습니다. 또한 WM_ERASEBKGND 호출 (현재 FillSolidRect에 대한 간단한 호출)에 대한 응답으로 페인트하는 사용자 정의 배경이 있습니다.

대화 상자가 크기가 커지면 엄청난 깜박 거리는 소리가 나옵니다. 깜박임을 줄이려면 모든 어린이 창을 열거하고 클리핑 영역에 추가합니다. 그것은 조금 도움이되는 것 같습니다. 이제 깜박 거리는 것은 다시 칠할 때 모든 어린이 통제에서 분명합니다.

크기를 조정하면서 대화 상자를 깜빡 거리지 않도록하려면 어떻게해야합니까? 나는 이중 부러스가 일부를 수행해야한다고 생각하지만, 아동 통제와의 대화 상자로 어떻게 해야할지 잘 모르겠다 (모든 아동 통제 소유자가 소유자를 드러내거나 그와 비슷한 것을 만들지 않고).

순수한 Win32 기반 솔루션을 환영하지만 C ++ (.NET 아님)와 MFC를 사용하고 있습니다.

참고 : 내가 시도했지만 작동하지 않은 한 가지는 다음과 같습니다.

CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.FillSolidRect(rect, backgroundColor);

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
도움이 되었습니까?

해결책

"FillSolidRect"가 배경을 지우는 것이라고 가정하면 WM_ERASEBKGND에서 TRUE를 반환하십시오.

코드 조각에서 거의 수행중인 이중 버퍼링을하려면 CreateEcompatibleBitMap을 사용하여 MEMDC로 선택해야합니다.

다른 팁

OninitDialog 함수에 다음 줄을 추가 해보십시오.

    ModifyStyle(0, WS_CLIPCHILDREN, 0);

WM_ERASEBKGND 처리에서 아무것도하지 않고 주요 WM_Paint의 일부로 지우기를 수행하십시오. 유효하지 않은 영역을 다시 그리거나 더 쉽게 도면을 더블 버퍼 할 수 있도록 더 똑똑한 페인트를 칠할 수 있습니다.

지우기 배경에서 아무것도하지 않으면 한 위치에 모든 드로잉 코드가있어서 다른 사람들이 따르고 유지하기가 더 쉬워집니다.

WinXP 이상을 목표로하는 경우 WS_EX_Composited Style을 사용 하여이 스타일을 가진 최상위 창에 대한 기본적으로 이중 소통을 가능하게 할 수도 있습니다. 여기에는 자체 한계 세트가 있습니다. 특히 GetDC 등을 사용하여 더 이상 onpaint주기에서 나오지 않습니다.

호출의 매개 변수를 잘못 변환 메소드로 설정할 수 있습니다. 이렇게하면 창이 다시 그리면 WM_ERASEBKGND를 보내지 않습니다. 여기 창의 깜박임을 방지하기위한 좋은 링크입니다.

이중 버퍼링은 실제로이 작업을 수행하는 유일한 방법입니다.

아동 통제는 당신이 확인하는 한 스스로를 돌볼 것입니다. CLIPCHILDREN.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top