首页 > 代码库 > 添加右键菜单

添加右键菜单

有2种方式添加右键菜单:

1.无需在资源中添加Menu

(1) 在.h中定义HMenu变量,在.cpp中初始化菜单项。

HMenu m_hMenu; // .h中定义m_hMenu = CreatePopupMenu(); // InitDialog中初始化MENUITEMINFO mi;mi.cbsize = sizeof(mi);mi.fMask = MIIM_ID | MIIM_STRING;mi.fType = MFT_STRING;mi.fState = MFS_ENABLED; // 使能. MFS_DISABLED(不使能)mi_wID = 1;mi_dwTypeData = _T("Select All");InsertMenuItem(m_hMenu,0,TRUE,&mi);mi_wID = 2;mi_dwTypeData = _T("Clear");InsertMenuItem(m_hMenu,1,TRUE,&mi);

(2) 重载右键按下消息 OnRButtonDown

ClientToScreen(&point); // 转换为屏幕坐标OnContextMenu(this,point);

(3) 重载OnContextMenu函数

mi.cbSize = sizeof(mi);mi.fMask = MIIM_STATE;mi.fState = MFS_ENABLED;SetMenuItemInfo(m_hMenu,2,FALSE,&mi); //  2表示位置

INT cmdID = (INT)TrackPopupMenu(m_hMenu,TPM_RETURNCMD,point.x,point.y,0,this->m_hWnd,NULL); // 此处必须为TPM_RETURNCMD,可以返回0,1,2,3...否则只返回0,1的值
switch(cmdID)
{
  case 1: // select all
    OnEditSelectAll(); // 响应函数
    break;
  case 2: // copy
    this->copy();
    break;
  default:
    break;
}

2.在资源文件中添加菜单资源

(1)资源文件中添加弹出菜单资源

(2)添加对应菜单项的响应函数

(3)重载OnContextMenu函数

CMenu menu;menu.LoadMenu(IDR_POPUPMENU); // IDR_POPUPMENU为自定义的弹出菜单IDCMenu *popMenu = menu.GetSubMenu(0);popMenu->EnableMenuItem(ID_EDIT,MF_BYCOMMAND | MF_DISABLE | MF_GRAYED); // 使这一菜单项变灰,失效popMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,point.x,point.y,this);

// 假如坐标不对,可以重载右键按下,调用ClientToScreen,再调用OnContextMenu

 

  

 

添加右键菜单