.팝업 메뉴

캔버스 윈도우에도 팝업 메뉴를 달아 보자. 메인 메뉴에도 편집 명령이 있기는 하지만 팝업은 마우스의 이동 거리가 짧고 편집 대상에 대해 직접 사용할 있어 편리하며 또한 캔버스의 독립성을 높여 주기도 한다. 리소스에 메뉴는 이미 작성되어 있으므로 메뉴를 출력하는 코드만 작성하면 된다.

 

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

{

   HMENU hMenu, hPopup;

   int TempSel;

   POINT pt;

 

   pt.x=LOWORD(lParam);

   pt.y=HIWORD(lParam);

   ScreenToClient(hWnd,&pt);

   TempSel=FindObject(pt.x,pt.y);

   if (NowSel != TempSel) {

      NowSel=TempSel;

      InvalidateRect(hWnd,NULL,TRUE);

      UpdateWindow(hWnd);

   }

  

   hMenu=LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_POPUP));

   hPopup=GetSubMenu(hMenu, 0);

   if (NowSel == -1) {

      EnableMenuItem(hPopup, IDM_POPUP_DELETE, MF_BYCOMMAND | MF_GRAYED);

      EnableMenuItem(hPopup, IDM_POPUP_PROPERTY, MF_BYCOMMAND | MF_GRAYED);

   }

 

   TrackPopupMenu(hPopup, TPM_LEFTALIGN, LOWORD(lParam), HIWORD(lParam),

      0, hWnd, NULL);

   DestroyMenu(hMenu);

   return 0;

}

 

IDR_POPUP 번째 팝업 메뉴를 읽어와 TrackPopupMenu 함수로 출력했다. 메뉴를 표시하기 전에 클릭한 곳의 도형을 곧바로 편집할 있도록 선택하고 선택 상태에 따라 삭제, 속성 항목의 상태를 변경한다. 선택된 도형이 없으면 삭제, 속성 명령도 사용할 없다. 팝업 메뉴 항목의 명령 처리는 이미 WM_COMMAND 작성해 두었다.