Notice
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- source
- winapi
- 드라이버
- NDK
- Visual C++
- driver
- kering
- 프로그래밍
- it
- C
- C++
- API
- 안드로이드
- database
- sqlite3
- Quiz
- jni강좌
- MFC
- Troubleshooting
- java
- Python
- android
- db
- gcc
- 리눅스
- 음악
- control
- linux
- UI
- jni
- Today
- 15
- Total
- 585,959
JHB의 프로그래밍 삽질기
무효화영역을 설정함에 있어서 주의할 점! 본문
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)라는 것! 하지만 남발하지 말고 다른 대안을 찾는 것이 좋을듯~~
주의합시다~~~!
'PROGRAMMING > C C++ MFC' 카테고리의 다른 글
더블 버퍼링 메모 (0) | 2008.12.02 |
---|---|
EDIT Control 안에 있는 내용 한번에 복사하기! (2) | 2008.11.13 |
더블클릭 메세지 사용하기 (0) | 2008.11.13 |
전처리기에 대하여 (0) | 2008.11.13 |
무효화영역을 설정함에 있어서 주의할 점! (0) | 2008.11.11 |
메모리 DC 사용하기 (0) | 2008.10.31 |
system(); 함수 사용시에 폴더 경로를 절대경로로 지정할 때 주의할점! (0) | 2008.10.27 |
Win32 API에서 보이는 특이한 종류의 변수선언식별자들 (0) | 2008.10.23 |
lParam과 wParam은 무엇인가? (2) | 2008.10.21 |
- Tag
- API, Visual C++, winapi, 프로그래밍
0 Comments