windowproc 예제

다음 예제에서는 대화 상자에서 편집 컨트롤의 인스턴스를 하위 클래스로 분류하는 방법을 보여 주며 있습니다. 하위 클래스 창 프로시저를 사용하면 컨트롤에 입력 포커스가 있는 경우 편집 컨트롤이 ENTER 및 TAB 키를 포함한 모든 키보드 입력을 수신할 수 있습니다. 다음 예제에서는 일반적인 창 프로시저의 구조를 보여 주며 있습니다. 창 프로시저는 별도의 사례 문으로 처리되는 개별 메시지와 함께 switch 문의 메시지 인수를 사용합니다. 각 사례는 각 메시지에 대한 특정 값을 반환합니다. 처리되지 않는 메시지의 경우 창 프로시저는 DefWindowProc 함수를 호출합니다. 창 프로시저가 실행되는 동안 동일한 스레드에서 만든 창에 대한 다른 메시지를 차단합니다. 따라서 창 프로시저 내에서 긴 처리를 피하십시오. 예를 들어 프로그램이 TCP 연결을 열고 서버가 응답할 때까지 무기한 대기한다고 가정합니다. 창 프로시저 내에서 이 작업을 수행하면 요청이 완료될 때까지 UI가 응답하지 않습니다. 이 시간 동안 창은 마우스 또는 키보드 입력을 처리하거나, 자체를 다시 그리거나, 닫을 수 없습니다. 메시지가 WindowProc에 들어가면 uMsg 인수를 사용하여 어떤 메시지인지 확인할 수 있습니다. 많은 프로그래머와 제가 아는 모든 게임 프로그래머는 switch() 문을 사용하여 메시지를 결정합니다.

다음은 이 작업을 수행하는 방법의 예입니다(프로그램에서 수행하는 방식입니다). 다음 예제에서는 이전 예제의 창 프로시저를 창 클래스와 연결하는 방법을 보여 주습니다. 다음 섹션에서는 이미 새로운 작업을 수행해야 하는 항목을 수정하는 방법을 보여 드리겠습니다. 이런 식으로 난 그냥 말할 수 있습니다 “이 메시지를 처리, 그리고 그것에이 작업을 수행 …” 그리고 당신은 내가 무슨 뜻인지 알 수 있으며 전체 예를 볼수없이 그렇게 할 수 있습니다. 즉, 어쨌든 희망, 그래서 예를 들어, 😛 주의를 기울이십시오, WM_SIZE 메시지에 대한 설명서는 다음과 같습니다 : 먼저 우리가 추가할 코드를 제시 할 것입니다 (즉, 사용자에게 우리의 프로그램의 파일 이름을 표시합니다) 그리고 나는 우리의 프로그램에 통합됩니다. 나중에 나는 아마 당신에게 코드를 보여주고 당신이 당신의 프로그램에 통합 할 수 있습니다. 이것은 물론 나를 위해 더 나은 나에 대 한 많은 입력 하지 않아도 하 고 그것은 당신을 위해 더 나은 모든 프로그램에 코드를 추가할 수 있을 것입니다 그리고 그냥 내가 제시 하는 것 들. 이 작업을 수행하는 방법을 잘 모르는 경우 섹션에 포함된 예제 zip 파일을 확인하십시오. 우선 작업한 마지막 창에 대한 예제 코드를 받아 예상대로 컴파일하고 실행되는지 확인합니다. 그런 다음 다음 에 대해 작업을 계속하거나 수정할 새 프로젝트에 복사할 수 있습니다.

이것은 많은 것처럼 보일 수 있지만 모두 매우 간단한 코드입니다. 먼저 GetWindowLongPtr(HWND hWnd, int nIndex)을 호출하여 클래스에 대한 포인터를 복구합니다. 긴 *으로 저장되므로 클래스의 클래스로 다시 캐스팅해야 한다는 것을 잊지 마십시오.

Comments

comments