본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 10 메뉴~ - 4

지금까지 사용한 메뉴 코드는 내부적으로 TrackPopupMenu()함수를 가지고 만들어진 것이라고 한다.

이 함수의 원형은 다음과 같다.

 BOOL TrackPopupMenu(

UINT nFlags,        //메뉴 윈도우의 위치, 에니메이션효과 등 동작특성을 결정

int x, int y,           //출력할 좌표 **반드시 스크린 기준
CWnd* pWnd,      // WM_COMMAND 메시지를 전송할 윈도우 객체의 주소.

LPCRECT lpRect = NULL    //이값은 현재 사용하지않음.

);


다음으로는 속성값들을 정리한 내용이다



마우스 우클릭으로 메뉴 띄우기.

CCommandDemoView 에 OnRButtonDown 메시지 핸들러를 추가하고 다음과 같이 입력한다.


void CCommandDemoView::OnRButtonDown(UINT nFlags, CPoint point)
{

CMenu* pMainMenu = AfxGetMainWnd()->GetMenu();
//CMainFrame 윈도우의 메뉴에 대한 포인터를 가져온다.
CMenu* pSubMenu = pMainMenu->GetSubMenu(4);
//메인 메뉴중에서 4번 인덱스의 서브메뉴에 대한 포인터를 가져온다.

CPoint ptMenu = point;//스크린 기준으로 좌표 변환.
ClientToScreen(&ptMenu);

pSubMenu->TrackPopupMenu(TPM_LEFTBUTTON | TPM_LEFTALIGN, ptMenu.x, ptMenu.y, AfxGetMainWnd());
//WM_COMMAND 메시지가 메인 프레임 윈도우에 전달되도록 팝업 메뉴 윈도우를 출력한다.
//속성은 보다시피 왼클릭으로 내부 메뉴 클릭  지정 위치[마우스의 위치] 의 좌측정렬.
CView::OnRButtonDown(nFlags, point);
}

출력시 화면 


화면에 서브메뉴 라는게 추가되어있는 이유는 그냥 추가했기 때문.

다른 메뉴를 만들듯이 만들면 된다.

특이한점은 서브 메뉴 와 마찬가지로 하위 메뉴가 있는 메뉴의 경우

ID가 없다는 것.[클릭 자체가 되지 않기 때문이다.]

그러니까 그림으로 표현하면 이렇게된다.



이런 식으로 이해하면 편하다.