BLOG ARTICLE 입력 | 1 ARTICLE FOUND

  1. 2007.01.04 입력

입력

programming/API 2007. 1. 4. 14:12
1. 키보드로 입력이 발생되면 윈도우는 WM_CHAR, WM_KEYDOWN 메시지 발생
  입력된 문자의 코드는 WPARAM으로 전달되며 LPARAM에는 비트별로 복잡한 정보가 전달
  필요한 정보가 있으면 LPARAM을 참조하고 필요없으면 WPARAM만 사용하면 된다

2. 무효영역
  InvalidateRect 함수를 호출하여 강제로 WM_PAINT 메시지를 발생할 수 있다.
  BOOL InvalidateRect(HWND hWnd, CONST RECT * lpRect, BOOL bErase);

3. 문자를 입력하고자 할 경우는 WM_CHAR 메시지를 사용하고
  문자 이외의 키는 입력 받을 수 없다. 이럴때는 WM_KEYDOWN 메시지를 사용 한다.

4. 키보드를 입력하게 되면 Getmessage는 메시지 큐에서 메시지를 꺼낸 후 메시지를 TranslateMessage
  함수로 넘긴다. TranslateMessage 함수는 전달된 메시지가 WM_KEYDOWN 인지와 눌러진 키가
  문자키인지 검사해 보고 조건이 맞을 경우 WM_CHAR 메시지를 추가로 발생시킨다.

5. 마우스 입력
  가. 마우스 메시지는 LPARAM의 상위 워드에 마우스 버튼이 눌러진 Y좌표, 하위 워드에 X좌표를 가지며
    좌표값을 검출해 내기 위해 HIWORD, LOWORD 등의 매크로 함수를 사용한다. 즉 마우스 메시지가
    발생한 위치의 좌표는 (LOWORD(LPARAM), HIWORD(LPARAM))이 된다.
    좌표값을 음수가 발생할 수도 있다. 모니터가 2개이상일 시
  나. WPARAM에는 마우스 버튼의 상태와 키보드 조합 키(SHIFT, CTRL)의 상태가 전달된다.
  * 상, 하위 워드 추출, WORD로 부터 상, 하위 바이트 추출, 조립 매크로 들이 존재한다.
    (LOWORD, HIWORD, LOBYTE, HIBYTE <- 추출, MAKEWORD(A,B), MAKELONG(A,B) <- 조립)
  다. 더블클릭
    1) 더블클릭을 사용할시는 더블클릭 메시지를 받고자하면 윈도우 클래스의 스타일에 원한다는
      의사표시를 해야한다.
        WndClass.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCKS;
    2) 디폴트로 지원하지 않고 플래그를 지정하도록 되어 있는 이유는 더블클릭을 검출하는데는
      그만큼 실행시간의 감소가 요구되며 어떤 프로그램은 더블클릭보다 WM_LBUTTONDOWN을 두 번
      받기를 원할 수도 있기 때문이다. 가령 트리플 클릭을 검출하고 싶은데 더블클릭이 디폴토로 지원
      하게 되면 트리플 클릭이전에 운영체제에 의해 더블클릭이 처리되어 버리기 때문이다.

6. 타이머
  가. 한 번 지정해 놓기만 하면 일정한 시간 간격을 두고 연속적으로 계속 발생한다.
    Uint SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
    BOOL KillTimer(HWND hWnd, UINT uIDEvent);
  나. LRESULT SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    강제로 메시지가 발생한 것처럼 만들어야 할 때 사용
  다. WndProc에서 첫 번째로 처리하는 메시지는 WM_CREATE 메시지이다.
  라. 두 개의 타이머
    SetTimer 함수의 두번째 인수로 지정한 값(타이머 ID)를 다르게 줌으로 가능하며
    (타이머 ID가 다른 2개의 타이머 함수 호출) 어떤 타이머로 부터 메시지가 발생하면
    WPARAM으로 타이머 ID가 전달된다.
  마. 콜백함수
    1) SetTimer의 네 번째 인수는 타이머 프로시저 함수의 포인터를 가리킨다. NULL일시는 첫 번째 인수로
      지정된 hWnd로 WM_TIMER 메시지가 전달되지만 이 인수에 타이머 함수가 지정되었을 경우는
      매 시간마다 이 함수가 대신 호출된다.
      VOID CALLBACK TimerProc(HWND hWnd, UINT uMsg, UINT idEvent, DWORD dwTime);
    2) 콜백함수를 사용하는 것과 WM_TIMER 메시지를 받는 것은 사실상 거의 동일한 기법이라고
      할 수 있으며 상황에 따라 편리한 방법을 사용하면 된다. 차이점이라면 WM_TIMER 메시지는 다른
      메시지가 있을 경우 실행 순서에 밀려 늦게 호출되는 경우가 있지만 콜백함수를 사용하면
      정확한 시간에 호출된다는 점이다.; 그래서 정확도를 요하는 작업은 타이머 메시지보다는 콜백함수를
      사용하는 것이 더 좋다고 되어 있다.
  바. 일회용 타이머
    타이머를 원하는 곳에 SetTimer함수를 사용한뒤 WM_TIMER 부분에 KillTimer을 호출하면 됨

7. 윈도우 관리 메시지
  가. 작업영역의 좌표를 조사 BOOL GetClientRect(HWND hWnd, LPRECT lpRect);
  나. 윈도우의 크기가 변경될 때마다 윈도우로 부터 WM_SIZE 메시지가 전달됨
    LPARAM의 하위워드는 변경된 후의 윈도우 폭이 상위 워드에는 높이가 전달되며
    WPARAM에는 이 메시지가 발생한 이유를 나타내는 플래그가 전달됨
  다. 윈도우의 위치가 변경될 때마다 WM_MOVE 메시지가 발생됨
    LPARAM의 하위워드는 새로운 X좌표, 상위워드는 새로운 Y좌표
AND