- HOME
- Post in | c/c++/winapi
- Post at | 2015. 3. 10. 21:37 | by 밀크빵.
- View comment
window 깜빡임 처리 - WM_ERASEBKGND와 WM_PAINT
Window는 뭔가 새로 그려야할 필요성 있을 때마다 WM_PAINT Message를 받습니다. OnPaint라는 이름으로 WM_PAINT에 대한 Handler Function이 보통 만들어지죠. System으로부터 WM_PAINT가 날아오는 상황은 다음과 같습니다.
- 윈도우가 처음 생성되었을 때
- 윈도우의 위치가 이동되었을 때
- 윈도우의 크기가 변경되었을 때(최소 및 최대화 포함)
- 윈도우의 전체 또는 일부가 다른 윈도우에 가려져 있다가 나타날 때
- 윈도우가 스크롤 될 때
- UpdateWindow나 RedrawWindow 함수가 불렸을 때
- InvalidateRect나 InvalidateRgn 함수가 불려서 다시 그려져야할 영역이 발생 한 후,
Message Queue에 다른 처리할 Windows Message가 없을 때
그런데 WM_PAINT가 날아오기 '전'에 대부분 같이 따라오는 Message가 있습니다 WM_ERASEBKGND라는 것으로, Erase Background 라는 의미죠. 즉, 배경을 지워라.
Window의 기본 Message Procedure(DefWindowProc)는 사용자가 WM_ERASEBKGND를 받고도 아무 처리를 하지 않으면, WNDCLASS의 hbrBackground 맴버에 정의된 색상으로 배경을 지워버립니다. 깜빡이는 것은 아래 처럼 되기 때문에 발생하는 것이지요.
1. WM_ERASEBKGND 받음
2. 배경 지움
3. WM_PAINT 받음
4. Image 다시 그림
2까지가 '깜'이고 4까지 가면 '빡'이 됩니다. 깜빡 깜빡의 실체는 이것입니다.
손쉬운 처리는 WM_ERASEBKGND를 받았을 때, 배경을 안지우도록 하는 방법입니다. 보통 OnEraseBkgnd 정도의 이름을 갖게 되는 WM_ERASEBKGND Message Handler에서 0을 return 하면 됩니다.
BOOL CAboutDlg::OnEraseBkgnd(CDC* pDC)
{
return 0;
}
깜빡 거리는 것이 WM_PAINT Message Handler에서 그려주는 어떤 것이 아니라, 또 다른 Window인 '자식' Control이라면, Window Styles 중에 WS_CLIPCHILDREN Style을 '부모' Window에 먹여서 자식 Control에 의해 가려지는 영역은 그리기 대상에서 아예 제외시켜버리는 것이 일반적인 해결책입니다.
출처 : 데브피아 ( 박재민(MAXIST) )
- 윈도우가 처음 생성되었을 때
- 윈도우의 위치가 이동되었을 때
- 윈도우의 크기가 변경되었을 때(최소 및 최대화 포함)
- 윈도우의 전체 또는 일부가 다른 윈도우에 가려져 있다가 나타날 때
- 윈도우가 스크롤 될 때
- UpdateWindow나 RedrawWindow 함수가 불렸을 때
- InvalidateRect나 InvalidateRgn 함수가 불려서 다시 그려져야할 영역이 발생 한 후,
Message Queue에 다른 처리할 Windows Message가 없을 때
그런데 WM_PAINT가 날아오기 '전'에 대부분 같이 따라오는 Message가 있습니다 WM_ERASEBKGND라는 것으로, Erase Background 라는 의미죠. 즉, 배경을 지워라.
Window의 기본 Message Procedure(DefWindowProc)는 사용자가 WM_ERASEBKGND를 받고도 아무 처리를 하지 않으면, WNDCLASS의 hbrBackground 맴버에 정의된 색상으로 배경을 지워버립니다. 깜빡이는 것은 아래 처럼 되기 때문에 발생하는 것이지요.
1. WM_ERASEBKGND 받음
2. 배경 지움
3. WM_PAINT 받음
4. Image 다시 그림
2까지가 '깜'이고 4까지 가면 '빡'이 됩니다. 깜빡 깜빡의 실체는 이것입니다.
손쉬운 처리는 WM_ERASEBKGND를 받았을 때, 배경을 안지우도록 하는 방법입니다. 보통 OnEraseBkgnd 정도의 이름을 갖게 되는 WM_ERASEBKGND Message Handler에서 0을 return 하면 됩니다.
BOOL CAboutDlg::OnEraseBkgnd(CDC* pDC)
{
return 0;
}
깜빡 거리는 것이 WM_PAINT Message Handler에서 그려주는 어떤 것이 아니라, 또 다른 Window인 '자식' Control이라면, Window Styles 중에 WS_CLIPCHILDREN Style을 '부모' Window에 먹여서 자식 Control에 의해 가려지는 영역은 그리기 대상에서 아예 제외시켜버리는 것이 일반적인 해결책입니다.
출처 : 데브피아 ( 박재민(MAXIST) )
'c/c++ > winapi' 카테고리의 다른 글
WM_GESTURE에서 PAN 입력 받기 (one/ two finger) (0) | 2015.04.14 |
---|---|
인터넷에 연결 되어있는지 확인하는 API (0) | 2014.04.01 |
API _ 선, 박스, 도형 그리기 (0) | 2013.02.20 |
Win32 프로젝트를 빈프로젝트로 생성하여 DialogBox 띄우기 (0) | 2013.02.18 |
활성화된 화면 캡쳐 ScreenCapture (0) | 2013.02.15 |