.메뉴 관리

ApiDraw 메뉴를 통해 도구를 선택하도록 되어 있는데 이럴 경우 통상 메뉴에도 현재 선택된 도구의 상태를 보여 주어야 한다. 선택된 도구 항목에 체크 표시를 붙이도록 보자. 메인 메뉴가 펼쳐질 WM_INITMENU 메시지가 전달되는데 이때 NowTool 대응되는 항목에 체크 표시를 한다.

 

LRESULT Main_OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   UINT MenuItem;

   for (MenuItem=IDM_SHAPE_SELECT;MenuItem<=IDM_SHAPE_META;MenuItem++) {

      CheckMenuItem((HMENU)wParam,MenuItem,MF_BYCOMMAND | MF_UNCHECKED);

   }

   CheckMenuItem((HMENU)wParam,IDM_SHAPE_SELECT+NowTool,MF_BYCOMMAND | MF_CHECKED);

   return 0;

}

 

루프를 돌며 선택~메타 파일까지의 항목에 체크 표시를 모두 없앤 NowTool 도구에 대해서만 체크 표시를 붙이도록 했다. 도구들은 상호 배타적으로 선택되는 옵션이므로 라디오 항목으로 선택된 도형을 보여줄 수도 있다. 다음과 같이 수정하면 된다.

 

LRESULT Main_OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   CheckMenuRadioItem((HMENU)wParam,IDM_SHAPE_SELECT,IDM_SHAPE_META,

      IDM_SHAPE_SELECT+NowTool,MF_BYCOMMAND);

   return 0;

}

 

논리적으로 라디오 그룹이 맞지만 체크 표시가 일반적이므로 ApiDraw 체크 표시를 출력하도록 했다. 액셀러레이터 리소스도 미리 작성되어 있으므로 메인 메시지 루프에서 처리하도록 하자.

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

     ,LPSTR lpszCmdParam,int nCmdShow)

{

   ....

   hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,

      CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

      NULL,(HMENU)NULL,hInstance,NULL);

   ShowWindow(hWnd,nCmdShow);

  

   HACCEL hAccel;

   hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));

   while(GetMessage(&Message,0,0,0)) {

      if (!TranslateAccelerator(hWnd,hAccel,&Message)) {

          TranslateMessage(&Message);

          DispatchMessage(&Message);

      }

   }

   return (int)Message.wParam;

}

 

선택된 상태에서 Del키만 누르면 즉시 삭제될 것이다. Ctrl+S, Ctrl+E 등의 액셀러레이터로 도구를 선택할 수도 있고 Ctrl+Q 누르면 즉시 선택 상태로 돌아온다.