在 MFC(Microsoft Foundation Classes)中,CMenu::TrackPopupMenuEx 是 CMenu 类的一个公共方法,用于在指定位置显示弹出式菜单,并等待用户选择菜单项。

以下是该方法的基本信息:
BOOL TrackPopupMenuEx(
   UINT fuFlags,
   int x,
   int y,
   CWnd* pWnd,
   LPTPMPARAMS lptpm
);

参数说明:

  •  fuFlags: 用于指定弹出式菜单的标志,如 TPM_LEFTALIGN、TPM_RETURNCMD 等。

  •  x: 菜单出现的 x 坐标。

  •  y: 菜单出现的 y 坐标。

  •  pWnd: 与菜单关联的窗口。

  •  lptpm: 一个指向 TPMPARAMS 结构的指针,该结构包含了额外的参数,如菜单的水平和垂直偏移等。


TPMPARAMS 结构定义如下:
typedef struct tagTPMPARAMS {
   UINT  cbSize;
   RECT  rcExclude;
} TPMPARAMS, *LPTPMPARAMS;

返回值:

  •  如果用户选择了菜单项,且指定了 TPM_RETURNCMD 标志,则返回用户选择的菜单项的标识符;否则,返回值为非零。如果用户取消菜单,返回值为零。


示例用法:
void CMyWnd::OnContextMenu(CWnd* pWnd, CPoint point)
{
    CMenu menu;
    menu.LoadMenu(IDR_CONTEXT_MENU); // 加载弹出式菜单资源

    CMenu* pSubMenu = menu.GetSubMenu(0); // 获取第一个子菜单

    // 准备 TPMPARAMS 结构
    TPMPARAMS tpmParams;
    tpmParams.cbSize = sizeof(TPMPARAMS);
    tpmParams.rcExclude = CRect(point.x - 1, point.y - 1, point.x + 1, point.y + 1); // 排除指定坐标

    // 在指定坐标显示弹出式菜单
    int nCmdID = pSubMenu->TrackPopupMenuEx(TPM_LEFTALIGN | TPM_RETURNCMD, point.x, point.y, this, &tpmParams);

    if (nCmdID != 0)
    {
        // 用户选择了菜单项
        // 根据 nCmdID 进行相应的处理
        // ...
    }
    else
    {
        // 用户取消了菜单
        // ...
    }
}

在上述示例中,首先通过 LoadMenu 方法加载了一个弹出式菜单资源,并通过 GetSubMenu 方法获取了第一个子菜单。然后,准备了一个 TPMPARAMS 结构,指定了额外的参数,例如排除指定坐标等。最后,通过 TrackPopupMenuEx 在指定坐标显示弹出式菜单,并等待用户的选择。如果用户选择了菜单项,返回值为用户选择的菜单项的标识符;如果用户取消了菜单,返回值为零。你可以根据返回值进行相应的处理。


转载请注明出处:http://www.pingtaimeng.com/article/detail/18999/MFC/CMenu