JHB의 프로그래밍 삽질기

무효화영역을 설정함에 있어서 주의할 점! 본문

PROGRAMMING/Win/MFC

무효화영역을 설정함에 있어서 주의할 점!

roter 2008.11.11 11:26
무효화 영역을 설정할때, 즉 WM_PAINT를 호출하기 위해 주로 쓰는 명령어는~~

BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);
인데

자~ 다음같은 명령을 한번 처리해보도록 하죠


static int tmp=333; //333은 0이나 1이 아니도록 아무거나 써준 숫자랍니다.

WM_PAINT:
 if(tmp == 0)
  process tmp0;
 else if(tmp == 1)
  process tmp1;
break;

WM_LBUTTONDOWN:
 tmp = 0;
 InvalidateRect(hWnd,NULL,TRUE);
 tmp = 1;
break;


자~ 마우스 왼쪽 버튼을 클릭할 경우 process tmp0이 처리될까요? 아니면 process tmp1이 처리될까요??
쉽게 생각 할 수 있는 것은 tmp = 0; 을 해준후 무효화영역을 설정하여 WM_PAINT를 호출하여 화면을 뿌려준 후에 tmp = 1;을 해주기 때문에, process tmp0이 실행될것만 같은 느낌이 들지요.
하지만 실제로 실행해보면 process tmp1이 실행된다는걸 느끼실 거에요!

어째서!!?

그 이유는! WM_PAINT는 가장 우선순위가 낮은 메세지 이기 때문이죠!
따라서 tmp = 0을 처리하고 무효화영역을 설정한후 tmp = 1을 처리하고 나서(즉, WM_LBUTTONDOWN이 끝나고 나서), WM_PAINT가 실행된다는 것이죠!

그렇다면 해결 방안은 어떻게 될까요? 생각보다 간단하답니다. UpdateWindow(HWND hWnd)를 사용하면 돼요!

WM_LBUTTONDOWN:
 tmp = 0;
 InvalidateRect(hWnd,NULL,TRUE);
 UpdateWindow(hWnd);
 tmp = 1;
break;

이렇게  InvalidateRect 다음에 곧바로 UpdateWindow를 써주면 됩니다~~ 하지만 WM_PAINT의 메세지 처리를 뒤로 미룬건 다 그만한 이유가 있는 것이겠죠??
모양이 복잡한 프로그램에서 UpdateWindow 를 남발하게 되면 다른 프로그램이 제때 CPU를 활용하지 못하게 되는 문제점이 발생할 수 있으므로 '너무 남발하지 맙시다~!!' 차라리 WM_PAINT에서 tmp의 값을 바꿔주도록 해요~~

한줄 요약!
InvalidateRect가 어디에 위치하건 간에, 나머지 코드를 다 처리하고 나서 무효화 시켜준다는 점! 이걸 해결해 주기 위해 쓰는 함수는 바로 UpdateWindow(hWnd)라는 것! 하지만 남발하지 말고 다른 대안을 찾는 것이 좋을듯~~

주의합시다~~~!
0 Comments
댓글쓰기 폼