MFC

다른 메뉴 제어하기와 PostMessage() 함수

윤주승 2025. 4. 7. 17:33

다른 메뉴 실행하기

  • WM_COMMAND 메시지를 코드로 전달하는 방법으로 구현
    - 메뉴의 실체는 WM_COMMAND 메시지의 매개변수 값
    - 모든 것이 메시지라는 사실을 재확인
  • PostMessage() 활용
    - SendMessage() 함수는 메시지 큐를 거치지 않고 핸들러 함수를 직접 호출
    - SendMessage() 함수는 가급적 사용하지 않는 것을 권장

PostMessage()와 SendMessage()는 다르다.

기본적으로 메시지가 큐에 저장되고 이벤트루프가 돌아서 처리기가 불리고 이런 형태로 알고있다.

PostMessage는 위 방식과 일치하다. 그러나 SendMessage는 메시지 큐를 거치지않고 핸들러함수를 바로 호출한다.

 PostMessage버튼을 만들고 해당 ID값을 해당 함수에서 호출하면 무한반복이된다.

그렇다면 앞서 만들었던 Start의 ID값을 넣게 되면 어떻게될까? Start 버튼을 누른것과 같은 결과값이 나온다.

this -> PostMessage(WM_COMMAND, ID_TEST_START);
::POSTMESSAGE(this->m_hWnd, WM_COMMAND, ID_TEST_START, 0);

 

WM_COMMAND는 명령이 발생했다는 것을 의미하는 메시지 상수이다.

ID가 ID_TEST_START인 메뉴 항목을 누른것처럼 작동하라는것을 의미한다.

::PostMessage는 특정 윈도우 핸들(hWnd)에게 메시지를 전달하는것을 의미한다.

 

바로가기 키

메뉴 버튼들을 보면 단축키가 설정돼있다. 직접 내가 원하는 단축키를 추가해볼 것이다.

Start에 단축키를 넣기위해 Start의 ID값이 필요 하다. 속성에서 ID값을 가져왔으면 좌측 Accelerator에서 설정해 줄 수 있다.

 

ID값을 넣어주고 단축키로 사용할 Shift와 단축키를 추가해주면 끝이다. 지울때는 Delete를 누르면 바로 삭제된다.


♨주의사항 : 똑같은 단축키를 넣어도 하나만 실행되고 에러는 발생하지 않기때문에 조심하자.