MFC listcontrol添加右键菜单
//listCtrl追加右键菜单
//头文件声明
int displayContextMenu(CPoint SelectPoint, int iFlag);
enum ListCmdID
{
ID_MENU_ENUM_FIRST = WM_USER+10,
ID_MENU_LISTITEM_DEL_USER,
ID_MENU_LISTITEM_EDIT_USER,
ID_MAX_LIST_CMD
};
//消息映射
ON_COMMAND_RANGE(ID_MENU_ENUM_FIRST, ID_MAX_LIST_CMD-1, onContextCmd)
//函数定义
void CMylistView::onContextCmd( UINT ID )
{
CListCtrl &lc = GetListCtrl();
switch( ID )
{
case ID_MENU_1:
//操作
break;
case ID_MENU_2:
//操作;
break;
case ID_MENU_3:
//操作;
break;
}
}
void CMylistView::OnNMRclick(NMHDR *pNMHDR, LRESULT *pResult)
{
CListCtrl &lc = GetListCtrl();
UINT flags;
CPoint SelectPoint;
GetCursorPos(&SelectPoint);
lc.ScreenToClient(&SelectPoint);
int iLine = lc.HitTest( SelectPoint, &flags );
int iFlag = 0;
lc.ClientToScreen(&SelectPoint);
//根据实际情况把菜单格式分类iFlag
displayContextMenu( SelectPoint,iFlag );
*pResult = 0;
}
int CMylistView::displayContextMenu(CPoint SelectPoint, WORD wShowFlag )
{
CListCtrl &lc = GetListCtrl();
CPoint pt( SelectPoint );
lc.ScreenToClient(&pt);
UINT flags;
CMenu menu;
int iLine = lc.HitTest( pt, &flags);
//check click on item or not
bool bOnItem = (flags & TVHT_ONITEM) != 0;
VERIFY(menu.CreatePopupMenu());
VERIFY(menu.AppendMenu(MF_STRING, ID_MENU_LISTITEM_ADD, _T("例如")));
VERIFY(menu.AppendMenu(MF_STRING, ID_MENU_TREEITEM_DEL, _T("例如")));
VERIFY(menu.AppendMenu(MF_SEPARATOR));
VERIFY(menu.AppendMenu(MF_STRING, ID_MENU_TREEITEM_EDIT, _T("例如")));
//不可用并且变灰
menu.EnableMenuItem( ID_MENU_LISTITEM_ADD, MF_GRAYED | MF_DISABLED );
menu.EnableMenuItem( ID_MENU_TREEITEM_DEL, MF_GRAYED | MF_DISABLED );
menu.EnableMenuItem( ID_MENU_TREEITEM_EDIT, MF_GRAYED | MF_DISABLED );
if( wShowFlag & 0x04 )
{
menu.EnableMenuItem( ID_MENU_LISTITEM_ADD, MF_ENABLED );
}
if( wShowFlag & 0x02 )
{
menu.EnableMenuItem( ID_MENU_TREEITEM_DEL, MF_ENABLED );
}
if( wShowFlag & 0x01 )
{
menu.EnableMenuItem( ID_MENU_TREEITEM_EDIT, MF_ENABLED );
}
if(menu.GetMenuItemCount() > 0 && bOnItem )
{
menu.TrackPopupMenu( TPM_RIGHTBUTTON , SelectPoint.x, SelectPoint.y, this);
}
return 0;
}