[ContextMenu]동적으로 콘텍스트 메뉴 생성

MFC 일 경우 OnContextMenu에서 아래와 같이 생성한다.

void CCustomCtrl::OnContextMenu(CWnd * pWndCPoint point)

{

CMenu Menu;

ifMenu.CreatePopupMenu() == TRUE)

{

for(i=0; i<(UINT)m_StringArrary.GetCount(); i++)

{

Menu.AppendMenu(MF_STRING | MF_ENABLEDPOPUPID_RANGE_START + i,m_StringArrary.GetAt(i));

}

Menu.AppendMenu(MF_SEPARATOR, 0, “”);

Menu.AppendMenu(MF_STRING | MF_ENABLEDPOPUPID_ENABLELOGPOPUPSTR_ENABLELOG);

Menu.AppendMenu(MF_STRING | MF_ENABLEDPOPUPID_DIABLELOGPOPUPSTR_DISABLELOG);

Menu.AppendMenu(MF_STRING | MF_ENABLEDPOPUPID_RESETPOPUPSTR_RESET);

Menu.AppendMenu(MF_STRING | MF_ENABLEDPOPUPID_ACTIVEUIIDPOPUPSTR_ACTIVEUIID);

Menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTONpoint.xpoint.ythis);

}

}


그리고 위 메시지를 처리하기 위해 메시지 맵에다가 아래와 같이 선언한다.

BEGIN_MESSAGE_MAP(CCustomCtrlCOleControl)

ON_COMMAND_RANGE(POPUPID_RANGE_STARTPOPUPID_RANGE_ENDOnCommandRange)

ON_COMMAND(POPUPID_DIABLELOGOnDisableLog)

ON_COMMAND(POPUPID_ENABLELOGOnEnableLog)

ON_COMMAND(POPUPID_RESETOnResetCommand)

ON_COMMAND(POPUPID_ACTIVEUIIDOnGetActiveUIIDCommand)

END_MESSAGE_MAP()

ON_COMMAND_RANGE 의 경우는 아래와 같이 처리한다.

void CCusomCtrl::OnCommandRange(UINT uiCommandID)

{

switch(uiCommandID) {

};

}

 

참고로 BCG에서는 아래와 같이 처리한다.

void CQueryBuilderGridCtrl::OnContextMenu(CWndpWndCPoint point)

{

CMenu contextMenu;

if(contextMenu.CreatePopupMenu() == TRUE)

{

contextMenu.AppendMenu(MF_STRING | MF_ENABLEDQBGC_ID_SEARCH_T(“&Search”) );

contextMenu.AppendMenu(MF_SEPARATOR, 0, “”);

contextMenu.AppendMenu(MF_STRING | MF_ENABLEDQBGC_ID_INSERT_T(“&Insert”) );

contextMenu.AppendMenu(MF_STRING | MF_ENABLEDQBGC_ID_DELETE_T(“&Delete”) );

contextMenu.AppendMenu(MF_STRING | MF_ENABLEDQBGC_ID_GROUP_T(“&Group”) );

contextMenu.AppendMenu(MF_STRING | MF_ENABLEDQBGC_ID_UNGROUP_T(“&Ungroup”) );

CBCGPPopupMenu * pPopupMenu = new CBCGPPopupMenu;

if (!pPopupMenu->Create(thispoint.xpoint.ycontextMenu.GetSafeHmenu(), FALSE,TRUE))

{

return;

}

((CBCGPFrameWnd*)AfxGetMainWnd())->OnShowPopupMenu (pPopupMenu);

}

}


만약 좌표가 정확치 않은 경우 ClientToScreen 또는 ScreenToClient를 활용한다.