MFC動態添加菜單並響應,優缺點(響應函數不能動態添加)

方案一:在視類中處理

頭文件部分(不全)

public:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
private:
// 用來記錄當前是第幾次按下回車鍵
int m_nIndex;
// 爲視類增加一個CMenu 類成員變量,用於動態創建新的子菜單
CMenu m_menu;
// 用於保存輸入的字符
CString m_strLine;
public:
// 用來保存所有的字符串,即輸入的所有聯繫方式
CStringArray m_strArray;
afx_msg void OnPhone1();
afx_msg void OnPhone2();
afx_msg void OnPhone3();
afx_msg void OnPhone4();

映射管理:

ON_COMMAND(ID_32771, &CMFC_PhoneBookView::OnPhone1)
ON_COMMAND(ID_32772, &CMFC_PhoneBookView::OnPhone2)
ON_COMMAND(ID_32773, &CMFC_PhoneBookView::OnPhone3)
ON_COMMAND(ID_32774, &CMFC_PhoneBookView::OnPhone4)

字符響應函數(動態添加菜單項):

void CMFC_PhoneBookView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if (0x0d==nChar)
{
if (0==++m_nIndex)
{
m_menu.CreatePopupMenu();
GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu,_T("通訊錄(P)"));
GetParent()->DrawMenuBar();
MessageBox(_T("通訊錄"));
}
//動態添加子菜單
m_menu.AppendMenu(MF_STRING,32771+m_nIndex,m_strLine.Left(m_strLine.Find(_T(" "))));
m_strArray.Add(m_strLine);
m_strLine.Empty();
//更新窗口,讓窗口的客戶區無效
Invalidate();
}
else
{
// CFont font;
// font.CreatePointFont(300,_T("華文行楷"),NULL);
// CFont *pOldFont=dc.SelectObject(&font);
m_strLine+=char(nChar);
dc.TextOut(0,0,m_strLine);
// dc.SelectObject(pOldFont);
}
// dc.TextOut(0,20,_T("0123456789"));


CView::OnChar(nChar, nRepCnt, nFlags);

}


方案二:在框架類窗口中截獲菜單命令消息(OnCommand函數是重寫父類的虛函數,體現了C++的多態性),如果有錯誤出現,一般是框架類頭文件沒有添加視類頭文件,視類頭文件也應該添加Doc類頭文件

BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
int MenuCmdID=LOWORD(wParam);
CMFC_PhoneBookView *pView=(CMFC_PhoneBookView*)GetActiveView();
if (MenuCmdID>=ID_32771&&MenuCmdID<ID_32771+pView->m_strArray.GetSize())
{
MessageBox(_T("Test"));
CClientDC dc(pView);
dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdID-ID_32771));
return TRUE;
}

return 0;

}


//四個響應函數,故只能響應前四個輸入的值,即前四項子菜單
void CMFC_PhoneBookView::OnPhone1()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,m_strArray.GetAt(0));
}


void CMFC_PhoneBookView::OnPhone2()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,m_strArray.GetAt(1));
}


void CMFC_PhoneBookView::OnPhone3()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,m_strArray.GetAt(2));
}


void CMFC_PhoneBookView::OnPhone4()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,m_strArray.GetAt(3));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章