티스토리 뷰
무효화 영역을 설정할때, 즉 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)라는 것! 하지만 남발하지 말고 다른 대안을 찾는 것이 좋을듯~~
주의합시다~~~!
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)라는 것! 하지만 남발하지 말고 다른 대안을 찾는 것이 좋을듯~~
주의합시다~~~!
'Development > Windows' 카테고리의 다른 글
휠 메세지(WM_MOUSEWHEEL)가 안돼요 (0) | 2009.01.06 |
---|---|
그림 확대/축소가 부드럽게 이루어 지도록 하는 프로그램 (0) | 2009.01.05 |
더블 버퍼링 메모 (0) | 2008.12.02 |
EDIT Control 안에 있는 내용 한번에 복사하기! (2) | 2008.11.13 |
더블클릭 메세지 사용하기 (0) | 2008.11.13 |
메모리 DC 사용하기 (0) | 2008.10.31 |
Win32 API에서 보이는 특이한 종류의 변수선언식별자들 (0) | 2008.10.23 |
lParam과 wParam은 무엇인가? (2) | 2008.10.21 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- linux
- 리눅스
- 드라이버
- 프로그래밍
- Visual C++
- driver
- 음악
- 안드로이드
- source
- jni강좌
- db
- kering
- NDK
- it
- gcc
- API
- Troubleshooting
- java
- C
- winapi
- AWS
- Python
- android
- MFC
- C++
- algorithm
- Quiz
- jni
- Cloud
- database
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함