2008-10-02 29 views
9

크기를 조정하는 대화 상자가 있습니다. 또한 WM_ERASEBKGND 호출 (현재는 FillSolidRect에 대한 간단한 호출)에 대한 응답으로 페인트하는 사용자 지정 배경이 있습니다.Windows 대화 상자에서 WM_ERASEBKGND를 처리하는 동안 깜박임을 피하는 방법

대화 상자의 크기를 조정하면 계속 깜박입니다. 깜박임을 줄이기 위해 모든 하위 창을 열거하고 클리핑 영역에 추가합니다. 그것은 조금 도움이되는 것처럼 보입니다 - 이제 깜박임은 다시 칠할 때 모든 어린이 컨트롤에서 거의 분명합니다.

크기를 조정할 때 대화 상자가 깜박 거리지 않게하려면 어떻게해야합니까? 나는 이중 버퍼링이 부분을해야한다고 생각하지만, 자식 컨트롤 (모든 자식 컨트롤을 owner-draw 또는 이와 비슷한 것으로 만들지 않고)을 사용하여 대화 상자를 사용하여이를 수행하는 방법을 잘 모르겠습니다.

순수 Win32 기반 솔루션은 환영하지만 :)

는 주 내가, 내가 MFC를 C++을 사용 (하지 .NET)하고있어주의해야한다 : 나는 시도했지만 한 가지 (하지 작동하지 않았다 이유는 무엇입니까?) :

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

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY); 

답변

8

"FillSolidRect는"당신의 배경의 삭제라고 가정은 다음 WM_ERASEBKGND에서 TRUE를 반환.

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

3

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

CLIPCHILDREN을 확인하는 동안 하위 컨트롤이 자체를 관리합니다.

5

WM_ERASEBKGND 처리에서 아무 것도 수행하지 않고 기본 WM_PAINT의 일부로 지우기를 수행하십시오. 무효 영역을 다시 그리거나보다 쉽게 ​​드로잉을 이중 버퍼링 할 수 있도록 더 똑똑하게 페인트 할 수 있습니다.

배경 지우기에서 아무 것도하지 않으면 다른 사람이 쉽게 따라 잡고 유지 관리 할 수 ​​있도록 모든 위치에서 모든 그리기 코드를 사용할 수 있습니다. 당신의 OnInitDialog 함수에 다음 행을 추가

6

시도 :

ModifyStyle(0, WS_CLIPCHILDREN, 0); 
5

WinXP 이상을 대상으로하는 경우 WS_EX_COMPOSITED 스타일을 사용하여이 스타일의 최상위 창에 대해 기본적으로 이중 버퍼링을 사용할 수도 있습니다. 여기에는 GetDC를 사용하여 OnPaint 사이클을 그만 두지 않아도되는 고유 한 제한이 있다는 것을 명심하십시오.

4

InvalidateRect 메서드에 대한 호출 매개 변수를 false로 설정할 수 있습니다. 이렇게하면 윈도우를 다시 그릴 때 WM_ERASEBKGND를 보낼 수 없습니다. Here은 창에서 깜박임을 방지하는 훌륭한 링크입니다.