9.17(월) 이론-1

from Study/API 2007/10/10 15:22 view 26705
1.  WinMain() : 윈도우 클래스를 등록,생성

- CreateWindowEx() 는 WM_CREATE메세지를 발생시킨다. 이때 이 메세지를 처리를 먼저하고 HANDLE값을 반환한다.
- DestroyWindow()는 WM_DESTROY를 발생하며 윈도우를 파괴시킨다.
- 비Q메시지는 API함수 호출시 주로 발생하며 메세지 처리 함수에 직접 전달한다.
- 입력 메시지(마우스 메세지, 키보드 메세지)를 제외한 대부분의 메시지가 non-queued Message 이다.


- SendInput을 통하여 마우스, 키보드 드라이버에서 SHIQ로 가상으로 키를 넣을 수 있다.(화상키보드)
- 키보드 : 활성화된 윈도우에 메시지를 입력한다. Raw가 담당..
- 스레드당 한개 씩 메세지 Q를 갖는다. GetMessage를 통해서 메시지를 끄집어 낸다.
- DispatchMessage는 WndProc에 메시지를 전달해주는 역할을 한다.

- WM_PAINT
 => GetMessage does not remove WM_PAINT messages from the queue. The messages remain in the queue until processed. 참고(페졸드책:108page)
 윈도우 프로시저가 WM_PAINT 메시지를 처리하면서 BeginPaint()를 호출하면, 클라이언트 영역 전체는 유효화된다.
 또한 프로그램은 ValidateRect()를 호출함으로써 클라이언트 영역의 임의 직사각형 영역을 유효화할 수도 있다. 만약 이 호출의 결과로 무효 영역 전체가 유효화된다면, 메시지 큐에 현재 저장되어 있는 WM_PAINT 메시지는 제거된다.

- WM_KEYDOWN, WM_CHAR 메시지 ( 제프리 : 990p 메시지Q 꺼내오기)
1. QS_SENDMESSAGE 플래그가 설정되어 있으면 해당 메시지를 적절한 윈도우 프로시저로 보낸다. 이 작업 후에 함수는 리턴 하지 않고 계속 다음 메시지를 기다린다.
 2. POST 메시지 큐에 메시지가 있으면 인자로 전달된 MSG 구조체에 해당 메시지 정보를 복사한 후 리턴한다.
 3. QS_QUIT 플래그가 설정되어 있으면 WM_QUIT 메시지를 리턴하고, QS_QUIT 플래그를 제거한다.
 4. 하드웨어 입력 큐에 메시지(WM_KEYDOWN, WM_LBUTTONDOWN, …)가 있다면 MSG 구조체에 해당 메시지 정보를 복사한 후 리턴한다.
 5. QS_PAINT 플래그가 설정되어 있으면 WM_PAINT 메시지를 리턴한다.
 6. QS_TIMER 플래그가 설정되어 있으면 WM_TIMER 를 리턴한다.

WM_KEYDOWN, WM_CHAR, WM_KEYUP 의 처리 순서도 위의 알고리즘을 통하면 쉽게 이해할 수 있다. 기본적으로 사용자가 키보드를 눌렀다 떼게 되면 WM_KEYDOWN, WM_KEYUP 이 하드웨어 입력 메시지 큐에 추가된다.
WM_KEYDOWN 이 TranslateMessage 를 통하면 적절한 형태의 WM_CHAR 메시지가 PostMesage 로 큐에 추가된다. 물론 이 과정에서 WM_CHAR 가 WM_KEYUP 보다 늦게 추가되었지만 위의 알고리즘의 우선순위 판정에 의해서 다음 번 처리되는 메시지는 WM_CHAR 가 되는 것이다.


2. 사용자 정의 메시지

- SendMessage : 동기 메시지 전달(Non-Queue) GetMessage에서 리턴하지 않는다??
- PostMessage : 비동기 메시지 전달( 리턴값을 받을수 없다. ) 메시지를 보낸후에 대기하지 않는다.

- 0x000~0x03FF    : 미리 정의 메시지
- 0x0400~0x7FFF  : Control Message            WM_USER+a
- 0x8000~0xBFFF  : Application Message      WM_APP+a
- 0xC000~0xFFFF : Register Window Message()
- 0x10000~          : Reserved 보호되는 영역

- WPARAM => UINT : 16비트 시절 2바이트로 word였다. 지금은 4바이트
- LPARAM => ULONG

3. 메시지 Q 모양
- 우선순위 GetMessage Remark 참고

1. Sent messages
2. Posted messages
3. Input (hardware) messages and system internal events
4. Sent messages (again)
5. WM_PAINT messages
6. WM_TIMER messages

- WM_PAINT는 중복되었을때 무효영역의 합해진 크기를 지니게 된다. PAINTSTRUCT에 저장 넘어감.

1. SendMessage( 우선적으로 처리하게 한다.)
2. SendMesageNotify( 리턴을 기달리지 않는다. 그러면서 우선적으로 처리하게 된다. )





 

Tag | ,

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다