CMenu

右键菜单

void CChildView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
if (point.x == -1 && point.y == -1)
{
//keystroke invocation
CRect rect;
GetClientRect(rect);
ClientToScreen(rect);

point = rect.TopLeft();
point.Offset(5, 5);
}

CMenu menu;
VERIFY(menu.LoadMenu(IDR_RMENU));

CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CWnd* pWndPopupOwner = this;

while (pWndPopupOwner->GetStyle() & WS_CHILD)
pWndPopupOwner = pWndPopupOwner->GetParent();

pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
pWndPopupOwner);
}

显示,隐藏菜单

// hide
this->SetMenu(NULL);
this->DrawMenuBar();

// show
CMenu m_Menu;
m_Menu.LoadMenuW(IDR_MENU1);
SetMenu(&m_Menu);
this->DrawMenuBar();

修改系统菜单

已经有代码了,直接添加自定义菜单就可以了。
需要在 Resource.h 里面手动添加一个菜单 ID #define IDM_SYSCOMMAND_CUSTOM 32771
别忘了修改一下下面的下一个可用 id 序号,

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 135
#define _APS_NEXT_COMMAND_VALUE 32772
#define _APS_NEXT_CONTROL_VALUE 1005
#define _APS_NEXT_SYMED_VALUE 104
#endif
#endif
BOOL CMRLGaugerDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
...

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != nullptr)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
// 设置系统菜单
// 设置系统菜单 第一个参数可以设置选中,未选中 MF_UNCHECKED
// m_pSysMenu->AppendMenu(MF_CHECKED, IDM_SYSCOMMAND_CUSTOM, _T("Custom Menu"));
// pSysMenu->AppendMenu(0, IDM_SYSCOMMAND_CUSTOM, _T("Custom Menu"));
pSysMenu->InsertMenuW(0,MF_CHECKED| MF_BYPOSITION, IDM_SYSCOMMAND_CUSTOM, _T("菜单栏"));

}
...


void CMRLGaugerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}else if (nID == IDM_SYSCOMMAND_CUSTOM)
{
// toggle menu
if (MF_CHECKED == m_pSysMenu->GetMenuState(IDM_SYSCOMMAND_CUSTOM,MF_BYCOMMAND))
{
m_pSysMenu->CheckMenuItem(IDM_SYSCOMMAND_CUSTOM, MF_UNCHECKED);
}
else
{
m_pSysMenu->CheckMenuItem(IDM_SYSCOMMAND_CUSTOM, MF_CHECKED);
}

}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}