본문 바로가기

VC++

Flickering 을 방지해 보자

< 개요 >
다이얼로그에 다른 컨트롤을 올리고 WM_SIZE 이벤트가 발생하였을 때 크기변경을 하다보면 화면이 심하게 번쩍 거리는 것을 볼 수 있다. 이를 flickering이라고 하는데 여간 눈에 거슬리는 것이 아니다.  이런 현상을 줄이기 위한 방법으로 어떤 것이 있는지 알아 보고자 한다.
.............................................................................................................

그럼 깜박꺼림(Flicker)를 제거한는 간단한 프로그램을 짜 보죠.

초보자들이 비절씨를 할 때 아장 쉽게 할수 있는 것 중 하나가, CFormView 클레스를 뷰로 하여 작성한는 것입니다.

폼뷰로 프로그램을 작성하였을 때 쉽게 볼수 있는데요..

OwerDraw 속성을 적용하지 않는 기본 콘트롤이 폼뷰의 사이즈를 조정하면 깜박거리죠..

 

그럼 깜박거림을 없게하려면.

가장 쉬운게 부모 윈도우, 즉 폼뷰가 변경될 때 콘트롤들이 다시 그려지지 않게 하면 됩니다.

WS_CLIPCHILDREN

이 속성을 이용하면 되죠.

대신 이속성을 폼이 키기가 변경될 때 적용하면 더욱 효과적이죠.

void CFlicker_freeView::OnSize(UINT nType, int cx, int cy)
{
             ModifyStyle(0, WS_CLIPCHILDREN); // turn on WS_CLIPCHILDREN
             CFormView::OnSize(nType, cx, cy);           // default
             UpdateWindow();
             //this->Invalidate(false); 원하는 작업을 한다
             ModifyStyle(WS_CLIPCHILDREN, 0); // turn off WS_CLIPCHILDREN                  
             GetClientRect(&m_rectDraw);
}

이렇게요..

한가지 중요한게 남았는데.

구릅박스죠..

그릅박스 경우는 문제가 있어요.



자신의 차일드를 포함할수 있는데,

구름박스의 테두리 안쪽이 폼에도 속하지 않고, WS_CLIPCHILDREN 속성에 의하여 그룹박스에도

속하지 않게되어서  화면이 요상해 집니다.

이걸 해결 할려면. Transparent속성을 활성화 시켜 주면 됩니다.

 

다음에는 페인팅 작업이 너무 많아서 깜박거리는 것을 예기해 보죠..

수고 하세요.

 

=================================================================

WS_CLIPCHILDREN : 부모 윈도우가 그려질때 Child Window가 다시 그려지지 않도록 함

WS_CLIPSIBLINGS : 윈도우 프레임에 붙어 있는 느낌을 주도록 하는 스타일

From http://zheart.egloos.com/2695226