ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [4] - Mouse and Char
    Graphics 2021. 7. 3. 15:08

    WM_KEYDOWN message (Winuser.h) - Win32 apps | Microsoft Docs

    WM_KEYDOWN에 대해서 자사히 설명되어 있습니다. 특히 Mouse Input의 LPARAM의 경우에는 장치의 좌표가 16-bits 두 개로 이어진 이진정보로 나타나기 때문에 Bit Shift나 Masking을 활용할 수도 있습니다. 물론 Mouse의 정보를 추출해주는 함수들이 미리 마련되어 있습니다. 

    WM_CHAR와 WM_KEYDOWN의 차이?

    'F'를 눌렀을 때

    WM_KEYDOWN과 WM_CHAR이 함께 Message Queue에 들어갔다는 사실을 확인할 수 있습니다. 이에 반해 F1(Function Key)를 누른다면 다음과 같은 결과를 얻을 수 있습니다.

    'F1'을 눌렀을 때

    WM_CHAR Message를 확인할 수 없습니다. Enter나 Space의 경우엔 어떨까요?

    'Enter'를 눌렀을 때
    'Space'를 눌렀을 때

    이 밖에도 각기 다른 Keyboard input에 따라 Message가 다르게 발생하는 것을 확인할 수 있습니다.

    여기서 확인할 수 있는 것은 WM_CHAR은 기본적으로 Text input을 위한 Message라는 점입니다. Function Key들은 F1을 포함해서 대체로 Text로 Mapping된 Representation(또는 Character)을 갖지 않습니다. 

    또, WM_KEYDOWN Message는 문자의 대소를 구분하지 않습니다. 'F'를 누르든 'f'를 누르든 똑같은 결과가 나옵니다. WM_CHAR은 이에 대한 Notion이 존재해서 나름대로 Transformation을 해줍니다.

    별 것 아닌 이 이야기들 정리하면 Text를 Input으로 받아야 할 상황에선 WM_CHAR를 적극 활용하는 편이 좋습니다. 

    TranslateMessage()

    이 함수가 하는 일이 Messages를 확인하고 만약 어떤 Message가 WM_KEYDOWN Message이라면 Win32 Side의 Queue에 WM_CHAR Message를 생성합니다. 그래서 지금까지 작성한 코드의 Message Pump부의 TranslateMessage()를 주석처리하면 Keyboard input으로 WM_CHAR를 더 이상 받을 수 없다는 것을 확인할 수 있습니다. 더 자세한 사항은 차차 다가오겠으나 이 파트에서 핵심은 WM_CHAR Message를 생성하는 함수가 TranslateMessage()함수라는 사실입니다. 

    TranslateMessage()를 주석처리하면 WM_CHAR이 발생하지 않는다. 제작하려는 프로그램에 결단코 Text Input이 발생하지 않는다면 해당 함수를 호출하지 않아도 좋다.

    간단하게 활용

    CALLBACK 함수인 WndProc의 Argument WPARAM은 입력받은 문자의 ASCII Code나 어떤 Symbol입니다. 물론 이 WPARAM은 입력하는 IO Device에 따라서 각기 다른 Message 또는 정보를 갖고 있지만 여기선 무시합니다. 입력이 발생할 때마다 WPARAM을 char로 cast하여 string으로 만들어 Window의 Title을 설정할 수 있다면 눈으로 보면서 입력을 확인할 수 있을 것입니다. 특히, WM_CHAR가 대소문자를 구분할 수 있는지를 확인할 좋은 기회가 될 것입니다.

    잘 됩니다.

    이제 이런 기능들(Window Register, Window Creation 등등)을 Encapsulate하는 편이 좋아 보입니다.

    'Graphics' 카테고리의 다른 글

    [6] - Error Handling  (0) 2021.07.10
    [5] - Window Framework  (0) 2021.07.10
    [3] - Window Messages  (0) 2021.07.03
    [2] - Message Pump  (0) 2021.07.03
    [1] - Creating a window  (0) 2021.07.02
Designed by Tistory.