본문으로 바로가기

팜업메뉴(popup Menu)는 윈도우에서 마우스 오른쪽 버튼이 눌러지면 활성화 되는 메뉴로 주로 사용된다.
메뉴 생성성시 메뉴가 생성되는 윈도우를 설정해 주게 되어 있다.CWnd* pWnd에 부모 윈도우를 지정하게 된다.
BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );

단순하게 생각해서 메뉴가 보여지는 윈도우에서  메뉴를 생성하고 

CMenu menu;
menu.LoadMenu(IDR_MENU);
CMenu * menu1 = menu.GetSubMenu(1);  //WM_SET_ENABLE
menu1->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y,this);

메뉴를 클릭하면 이벤트가 해당 윈도우에 전달 되는 개념이다,


이벤트 핸들러를 다음과 같이 구성된다.
ON_UPDATE_COMMAND_UI(WM_SET_ENABLE, OnUpdateSEtEnableUI)

OnUpdateSEtEnableUI(CCmdUI* pCmdUI)
{

}
그런데 부모윈도우를 
TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y,this);
와 같이 사용하면 이벤트는 처리되지 않는다???
문법적으로 개념적으로 이사이 없어 보이는데 ????
이럴때는 아래 코드와 같이 부모윈도우를 AfxGetMainWnd() 로 처리하자

CMenu menu;
  menu.LoadMenu(IDR_MENU);
  CMenu * menu1 = menu.GetSubMenu(1); 
  menu1->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd());

CMenu가 FrameWnd에 속하므로 View에서 처리를 하지 않도록 구성된듯 한데.
이렿게 되어야 하는 이유는 다음에 생각 하기로 하고 우선은 그냥 사용하자.