投稿
wm_keydown 예제
2019年8月3日
다가오는 수업에서는 비디오 게임의 컨트롤에 대한 주요 이벤트를 활용할 것입니다. 예를 들어 화살표 키 컨트롤을 사용하여 우주선 과 “f” 키를 사용하여 발사할 수 있습니다. 다음 예제에서는 일반적인 응용 프로그램이 키 입력 메시지를 수신하고 처리하는 데 사용하는 창 프로시저 프레임워크를 보여 주며 있습니다. WM_CREATE 메시지를 처리하는 동안 예제에 표시된 창 프로시저는 키보드 입력을 저장하기 위한 64K 버퍼를 할당합니다. 또한 현재 로드된 글꼴의 메트릭을 검색하여 글꼴의 문자 높이와 평균 너비를 절약합니다. 높이와 너비는 클라이언트 영역의 크기에 따라 줄 길이와 최대 줄 수를 계산하기 위해 WM_SIZE 메시지를 처리하는 데 사용됩니다. 키를 누는 속도를 확인하려면 해당 키에 대한 WM_KEYDOWN 이벤트와 WM_KEYUP 이벤트를 모두 catch해야 합니다. 이 작업을 수행하는 것이 유용한 경우가 많습니다. 따라서 위의 WM_KEYUP 처리기의 예를 들어 보겠습니다. 이 처리기는 위쪽 화살표 키가 해제되면 메시지 상자를 팝업합니다. 이 섹션의 예제에서는 응용 프로그램이 키보드에서 문자를 수신하고, 창의 클라이언트 영역에 표시하고, 각 문자를 입력하여 캐런트의 위치를 업데이트하는 방법을 보여 주었습니다. 또한 왼쪽 화살표, 오른쪽 화살표, 홈 및 끝 키 입력에 대한 응답으로 캐릿을 이동하는 방법을 보여 주며 SHIFT+RIGHT ARROW 키 조합에 대한 응답으로 선택한 텍스트를 강조 표시하는 방법을 보여 줍니다.
일반적으로 스레드의 메시지 루프는 TranslateMessage 함수를 사용하여 가상 키 메시지뿐만 아니라 모든 메시지를 번역해야 합니다. TranslateMessage는 다른 유형의 메시지에는 영향을 주지 않지만 키보드 입력이 올바르게 번역되도록 보장합니다. 다음 예제에서는 일반적인 스레드 메시지 루프에 TranslateMessage 함수를 포함 하는 방법을 보여 주어집니다. 사용자로부터 문자 입력을 받는 모든 스레드는 메시지 루프에 TranslateMessage 함수를 포함해야 합니다. 이 함수는 키 입력 메시지의 가상 키 코드를 검사하고 코드가 문자에 해당하는 경우 문자 메시지를 메시지 큐에 배치합니다. 문자 메시지가 제거되고 메시지 루프의 다음 반복에서 전달됩니다. 메시지의 wParam 매개 변수에는 문자 코드가 포함되어 있습니다. WM_CHAR 메시지를 처리할 때 창 프로시저는 문자를 표시하고 입력 버퍼에 저장하며 카포트 위치를 업데이트합니다.
또한 창 프로시저는 탭 문자를 4개의 연속 된 공백 문자로 변환합니다. 백스페이스, 라인피드 및 이스케이프 문자는 비프음을 생성하지만 그렇지 않으면 처리되지 않습니다. . 키 입력 메시지를 처리할 때 시프트 키(Shift, Ctrl 및 Alt) 또는 토글 키(캡 잠금, 숫자 잠금 및 스크롤 잠금)를 누른지 여부를 알아야 할 수 있습니다.