화면 깜박거림을 제거합시다.
화면 떨림이란 모니터의 주사선과 그래픽카드의 잘못된 설정으로 생길수 있습니다.
그래픽 카드를 바꾸고, 모니터를 좋은 것으로 바꾸서 쓰면 되죠..
맞나요.. ㅋㅋ
그럼 프로그램할 때 화면 조정 말고 , 사이즈 조정이나 크기조정 또는 드래그, 및 콘트롤 사용시 나오는 깜박거림은 도대체 모죠?
해답은 있나요?
네 당근 입니다, (오이 부모왈~~)
그럼 시작하는 과정이므로 간단하게 가장 쉬운 폼뷰부터 시작하죠..
그럼 왜 깜박거림이 생기는가?
한가지 동일한 원인에 의하여 프로그램중 일부분이 그리기 작업을 하게 되고, 다른 부분이 그 곳에 다시 그리기 작업을 하게 됩니다.
그리고, 순식간에 두 가지 페인팅 작업이 발생이 되는데, 두번째 작업을 하기 전에 사용자가 첫번째 그리기 작업을 보기 되늣것입니다.
그럼 해결 방법은 있군요.
네. 두가지를 그리기를 하는데, 첫번째 작업이 끝나고 아주 빨리 두번째 그리기 작업을 하는것입니다.
그러나 , 이 방법은 사용자 피씨가 슈퍼콤이 아니면 아주 힘들겠죠..
어차피 두가지가 순식간의 터울로 드려지기 때문에 그리기 작업을 나눠서 하지 말고 동시에 해보자는 것입니다.
그럼 깜박꺼림(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속성을 활성화 시켜 주면 됩니다.
다음에는 페인팅 작업이 너무 많아서 깜박거리는 것을 예기해 보죠..
수고 하세요.
|