팜업메뉴(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() 로 처리하자
1 2 3 4 | CMenu menu; menu.LoadMenu(IDR_MENU); CMenu * menu1 = menu.GetSubMenu( 1 ); menu1->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, <span style= "color: #0000ff;" ><b>AfxGetMainWnd()</b></span>); |
CMenu가 FrameWnd에 속하므로 View에서 처리를 하지 않도록 구성된듯 한데.
이렿게 되어야 하는 이유는 다음에 생각 하기로 하고 우선은 그냥 사용하자.