. 취소 메뉴 코드

취소/재실행은 편집중에 필요한 명령이기 때문에 보통은 단축키를 사용한다. 하지만 호스트 프로그램은 명령의 정리를 위해 메뉴에도 취소/재실행 항목을 가지고 있다. 이 메뉴항목에 대한 코드도 물론 작성해야 한다. Dangeun.cpp를 열어 IDM_EDIT_UNDO, IDM_EDIT_REDO 메뉴항목에 대해 컨트롤의 Undo, Redo 함수를 호출하도록 코드를 작성하자. OnInitMenu에서 이 메뉴의 상태를 관리해야 한다.

 

void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

     case IDM_EDIT_UNDO:

          if (pSi->Ae.CanUndo())

              pSi->Ae.Undo();

          break;

     case IDM_EDIT_REDO:

          if (pSi->Ae.CanRedo())

               pSi->Ae.Redo();

          break;

     ....

 

void OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

     ....

          if (pSi->Ae.CanUndo()) {

              EnableMenuItem(hMenu,IDM_EDIT_UNDO, MF_BYCOMMAND | MF_ENABLED);

          } else {

              EnableMenuItem(hMenu,IDM_EDIT_UNDO, MF_BYCOMMAND | MF_GRAYED);

          }

          if (pSi->Ae.CanRedo()) {

              EnableMenuItem(hMenu,IDM_EDIT_REDO, MF_BYCOMMAND | MF_ENABLED);

          } else {

              EnableMenuItem(hMenu,IDM_EDIT_REDO, MF_BYCOMMAND | MF_GRAYED);

          }

     }

}

 

여기까지 코드를 작성하고 컴파일한 후 실행해보면 취소/재실행이 제대로 동작할 것이다. 아무리 마구 지워도 <Ctrl+Z>만 누르면 원래대로 돌아오며 <Ctrl+Y>만 누르면 취소한 내용을 재실행할 수 있다. 편집 메뉴의 항목을 사용해도 되고 리소스에 관련 액셀러레이터가 이미 정의되어 있으므로 단축키를 사용할 수도 있다.