본문 바로가기
C & C++/MFC 컨트롤

[Event] 오른쪽 마우스버튼으로 여는 컨텍스트 메뉴

by izen8 2011. 1. 12.
반응형

* 임무 *

MFC 프로그램을 만들다 보면 오른쪽 버튼으로 여는 컨텍스트 메뉴가 필요한 경우가 있다.

과연 어떻게 구현하는 걸까?

* 구현방법 *

1. CMenu를 이용 POPUP메뉴를 구현한다.

2. OnRButtonDown 이벤트 핸들러에서 TrackPopupMenu()를 구동시킨다.

3. 그러면 선택된 ID를 돌려 보내준다. 이것을 부모 윈도우에 메세지로 돌려보내준다.

4. 이후 메뉴에 집어넣은 ID값에 대한 핸들러를 작성하여 해당 메뉴를 선택하면 상응하는 함수가 호출 되어진다.

코딩 *

여기서는 예를 들어 DocTemplate 상황에서 구현하였다. 그러나 다이얼로그도 마찬가지임.

 

CMenu  m_ContextMenu; // 반대버튼 메뉴


void CDemoView::OnInitialUpdate()

{

  m_ContextMenu.CreatePopupMenu(); // 컨텍스트 메뉴하나를 생성

 

  m_ContextMenu.AppendMenu(MF_STRING, IDM_ACTION1, "메뉴1");  // 첫번째 메뉴항목

  m_ContextMenu.AppendMenu(MF_SEPARATOR);  // 구분선

  m_ContextMenu.AppendMenu(MF_STRING, IDM_ACTION2, "메뉴2");  // 두번째 메뉴항목

}

void CDemoView::OnRButtonDown(UINT nFlags, CPoint point)
{
  // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
  RECT ClientRect;
  GetWindowRect(&ClientRect);

  // TrackPopupMenu 이후에 DoModal을 사용하는 경우이므로 TPM_RETURNCMD 옵션을 사용함.
  LONG Item = m_ContextMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD,
                                                                      point.x+ClientRect.left, point.y+ClientRect.top, this->GetParentFrame());

  // 사용자가 메뉴선택을 마쳐야만 결과값이 리턴된다.
  CListView::OnRButtonDown(nFlags, point);

  if (Item)
  {
   // 뭔가가 눌렸으면 MainFrame으로 메세지를 보낸다. 이후 처리는 MainFram에서 이벤트로 발생됨.
   this->GetParentFrame()->SendMessage(WM_COMMAND, Item, 0);
  }
}


반응형

댓글