40일 차 교육 내용 메모를 옮겨 본다.
HDC 와 화면 버퍼링, 키 입력에 대한 내용이 메모에 작성되어 있다.
HDC 란
- H : 핸들
- DC : 그리기에 필요한 모든 정보를 가진 데이터 구조체
(DC의 내부 정보 종류로는 HPEN, HBRUSH, HFONT 등...)
화면 깜박임
- invalidaterect() 함수
- 무효화 영역 강제 발생
- WM_PAINT 강제 호출
- 매개변수 = HWND , RECT , ERASE
- ERASE : 이전 기록의 유지 유/무 , true 시 캔버스를 초기화
- 함수의 ERASE 가 true 라서 발생
근본적인 원인
- 그리는 사이사이의 캔버스가 화면에 그대로 노출되어 있기에
해결책
- 1번만 그리면 된다.
- 다른 HBITMAP에 그린 이후에 이 HBITMAP을 1회 화면에 그린다.
더블 버퍼링 or 백 버퍼링
- 임시 버퍼를 생성하여, 해당 버퍼에 렌더링 작업을 모두 진행한 이후 실제 버퍼로 데이터를 일제히 이동시켜 나타내는 방법
백 버퍼링 방법
1. 임시 종이 : HBITMAP
2. 임시 종이 정보를 다 그린다.
3. 임시 종이를 앞 종이에 옮겨 그린다.
문제 : HBITMAP에 직접 그리는 방법이 존재하지 않는다.
해결책
1. 기존 HDC와 동일한 HDC를 하나 더 만든다.
2. HBITMAP을 만든다.
3. 새로 만든 HDC에 새로 만든 HBITMAP을 넣는다.
4. DC간 고속 복사 함수로 HBITMAP을 복사한다.
5. HBITMAP 과 HDC를 지운다.
키 상태 체크
- GetKeyState 반환값
최상위 1bit = 현재 눌렸는가
최하위 1bit = 토글
- GetASyncKeyState
최상위 1bit = 현재 눌렀는가
최하위 1bit= 이전에 눌렀었는가
- 두 함수의 차이점
GetKeyState : 메시지 큐에서 눌림을 확인한다.
GetASyncKeyState : 함수 확인 시점에서의 눌린 상태를 확인한다.
교육된 키 입력 방식을 토대로 Key 입력의 stay, once_down , once_up , toggle 의 4가지 상태를 함수로 구현해 보는 과제를 줬다.
댓글 없음:
댓글 쓰기