ÄãµÄλÖãºÈí¼þÓë¹âÅÌ>
ÓÃMFCµÄÏûÏ¢Ó³ÏñʵÏÖ¶¯Ì¬²Ëµ¥
2000-01-30 00:00:00¡¤ -¡¤CPCW

--- µ±ÎÒÃÇÌáµ½¶¯Ì¬²Ëµ¥µÄʵÏÖʱ£¬ÎÒÃÇͨ³£µÄ×ö·¨ÊÇʹÓÃGetMenu() º¯Êý»ñȡһ¸öCmenu ÀàÖ¸Õ룬Ȼºóµ÷ÓÃCMenu Àà·½·¨AppendMenu, InsertMenu, ModifyMenu, RemoveMenu µÈ¡£±¾ÎĽéÉÜÒ»ÖÖ¸ü¼Ó¼ò½àµÄ·½·¨£¬ËüÀûÓÃMFC µÄÏûÏ¢Ó³Ïñ»úÖÆ¼°CCmdUI Àà·½·¨À´ÊµÏÖ¡£

---- Ê×ÏÈ£¬ÎÒÃǼòҪ˵˵VC ÖÐMFC µÄÏûÏ¢Ó³Ïñ¡£Ã¿¸öWindows ³ÌÐòÔ±´ó¸Å¶¼¶ÔÒÔǰʹÓõĴ°¿Úº¯ÊýWindowProc ¼ÇÒäÓÌУ¬µ±ÎÒÃÇÃæ¶Ô¸÷ÖÖÏûϢʱ£¬ÎÒÃDZðÎÞËû·½£¬Ö»ÄÜʹÓÃÅÓ´ó¶ø»úеµÄswitch-case Óï¾äÀ´ÊµÏÖ²»Í¬µÄ·ÖÖ§Ñ¡Ôñ¡£ÔÚVC5.0 ÖÐʹÓÃV4.2 °æµÄMFC »ù±¾Àà¿â£¬Ä㽫¸æ±ðswitch-case Óï¾ä£¬´úÖ®ÒÔ͸Ã÷µÄÏûÏ¢Ó³Ïñ¡£ÒªÔÚÒ»¸öÀàÖÐʹÓÃÏûÏ¢Ó³Ïñ£¬ÔÚÀàÉùÃ÷ÖУ¬±ØÐëÏÔʽµÄ¼ÓÈëºêDECLARE_MESSAGE_MAP£º

class CMyClass: public CBaseClass
{
DECLARE_MESSAGE_MAP()
}

---- ÔÚÀàʵÏÖÖУ¬±ØÐëʹÓÃÁ½¸öºêBEGIN_MESSAGE_MAP ºÍEND_MESSAGE_MAP£¬BEGIN_MESSAGE_MAP ´øÁ½¸ö²ÎÊý£ºµ±Ç°ÀàºÍÖ±½Ó¸¸Àࣺ
---- BEGIN_MESSAGE_MAP(CMyClass, CBaseClass)
---- // ÏûÏ¢Ó³ÏñÏî

---- ON_COMMAND(ID_APP_ABOUT, OnAppAbout)

---- // ÏûÏ¢Ó³ÏñÏî
---- END_MESSAGE_MAP()

---- ÏûÏ¢Ó³ÏñÏîʹÓÃÏÂÁлù±¾Óï·¨£º
---- ON_MessageName(ID, ClassMethod)

---- MessageName ÊÇÐèÒª´¦ÀíµÄÏûÏ¢£¬ID ÊÇ·¢ËÍÏûÏ¢µÄ±êʶ·û£¬¶øClassMethod Ϊ´¦Àí´ËÏûÏ¢µÄÀà·½·¨Ãû¡£MessageName ÊÇMFC Ô¤¶¨ÒåµÄ£¬¿É·ÖΪÒÔÏÂÈýÖÖ£º

---- ÃüÁîÏûÏ¢
---- ×Ó´°¿Ú֪ͨÏûÏ¢
---- Windows ÏûÏ¢

---- ¹²Ò»°Ù¶à¸ö£¬Óû§²»±Ø¼ÇסËüÃÇ£¬ÒòΪÏûÏ¢Ó³Ïñ¿ÉÒԺܼòµ¥µÄÀûÓÃClassWizard ¼ÓÈë¡£´¦ÀíÒ»¸öÏûÏ¢µÄÀà·½·¨ClassMethod ±ØÐëÔÚÀඨÒåÖÐÉùÃ÷£¬ÇÒÓÐʵÏÖ´úÂë¡£ÆäÔ­ÐÍΪ£º

---- Afx_msg return_type ClassMethod(paras table)

---- ÀàCCmdUI רÃÅ£¨ÇÒ½ö½ö£©ÓëON_UPDATE_COMMAND_UI ÏûÏ¢Ó³ÏñºêÅäÌ×ʹÓã¬ÓÃÓÚ¹ÜÀí²Ëµ¥£¨»¹Óй¤¾ßÀ¸°´Å¤µÈ£©µÄʵʱ״̬£¬ÈçÊÇ·ñ±ä»Ò£¬ÊÇ·ñ¼ÓÑ¡Öбê¼ÇµÈ¡£

---- ON_UPDATE_COMMAND_UI ÏûÏ¢Ó³ÏñºêÔ­ÐÍΪ£º

---- ON_UPDATE_COMMAND_UI(Menu_Item_ID, Menu_Proc)

---- ON_UPDATE_COMMAND_UI ÏûÏ¢Ó³Ïñºê½«Ò»¸ö²Ëµ¥ÏÃüÁîÏºÍÒ»¸ö¸üд¦Àí¹ý³ÌÁª½á£¬´Ó¶øÔÚÊʵ±µÄʱ»ú×Ô¶¯µ÷Óô˸üд¦Àí¹ý³ÌÀ´Íê³É¶Ô²Ëµ¥Ïî״̬µÄ¸üС£

---- Menu_Item_ID Ϊ²Ëµ¥ÏîµÄID ºÅ£¬Menu_Proc Ϊ´Ë²Ëµ¥ÏîµÄ¸üд¦Àíº¯Êý£¬Ô Ϊ£º

---- afx_msg void Menu_Proc (CCmdUI* pCmdUI)

---- Ëü´øÓÐÒ»¸öCCmdUI ÀàÖ¸Õ룬ʹÓÃËü¿Éµ÷ÓÃCCmdUI µÄÀà·½·¨¡£Óë²Ëµ¥ÓйصÄÀà·½·¨ÓУº

Enable(BOOL) ʹ²Ëµ¥ÏîÓÐЧ»òÎÞЧ
SetText(LPCTSTR) ÉèÖò˵¥ÏîµÄÎı¾
SetCheck(int) ¼ÓÉÏ»òÈ¥µôÑ¡Öбê¼Ç¡°X¡±
SetRadio(BOOL) ¼ÓÉÏ»òÈ¥µôÑ¡Öбê¼Ç¡°.¡±
---- MenuProc ±»µ÷ÓõÄʱ»úÓÐÒÔϼ¸ÖÖÇé¿ö£º
---- ÓÃÊó±êÑ¡Öаüº¬¸Ã²Ëµ¥ÏîµÄ²Ëµ¥Ìõ
---- ÓÃÈȼüÑ¡Öаüº¬¸Ã²Ëµ¥ÏîµÄ²Ëµ¥Ìõ
---- Óÿì½Ý¼üÑ¡ÖÐÓë¸Ã²Ëµ¥ÏîÔÚͬһ²Ëµ¥ÌõϵÄÈÎÒ»²Ëµ¥Ïî

---- ÎÒÃÇÒÔÏÂÃæ²Ëµ¥½á¹¹ÎªÀý£º

Test menu
Item One ID_ITEM_ONE Ctrl+1
Item Two ID_ITEM_TWO Ctrl+2
Popup Popup One ID_POPUP_ONE Ctrl+3
Popup Two ID_POPUP_TWO Ctrl+4
---- µ±ÓÃÊó±ê×ó¼üµã°´Test menu ²Ëµ¥Ìõ»ò°´Alt+t »ò°´Ctrl+1/2/3/4 ʱ£¬Ëĸö²Ëµ¥ÏîµÄ¸üд¦Àí¹ý³ÌMenuProc ¶¼½«±»µ÷Óá£
---- µ±ÎÒÃÇ¿¼²ìÉÏÃæÕâ¸ö¾ßÓÐǶÌ׽ṹµÄ²Ëµ¥Ê±£¬ÎÒÃÇÃæÁÙÕâÑùÒ»¸öÎÊÌ⣺²Ëµ¥ÏîItem One/Item Two µÄ¸üк¯ÊýºÍPopup One/Popup Two µÄ¸üк¯ÊýÐÎʽÉÏÊÇ·ñÒ»Ö£¿µ±Popup One ºÍPopup Two ¶¼±ä»ÒʱPopup ÊÇ·ñ×Ô¶¯±ä»Ò£¿

---- ¸ù¾ÝMFC µÄÄÚ²¿»úÖÆ£¬½ö½öµ¯³ö²Ëµ¥µÄµÚÒ»ÏîÓ¦¸½¼ÓһЩ´úÂ룬ÆäÓàÏîµÄÐÎʽ»ù±¾ÊÇÒ»Öµġ£Ò²¾ÍÊÇ˵ÔÚÉÏÀýÖУ¬³ý²Ëµ¥ÏîPopup One Í⣬ÆäËû²Ëµ¥Ïî¸üк¯ÊýµÄ´úÂë»ù±¾Ò»Ö£¬¼´¸ù¾ÝÌõ¼þ£¬¼òµ¥µ÷ÓÃCCmdUI Àà·½·¨¼´¿É¡£²Ëµ¥ÏîPopup One ÓÉÓÚÊǵ¯³öʽ²Ëµ¥Popup µÄµÚÒ»ÏËüµÄ¸üк¯ÊýÔÚÒÔÏÂÁ½ÖÖÇé¿ö϶¼»á±»µ÷Óãº

---- µ±µ¯³öʽ²Ëµ¥£¨Popup£©µÄ²Ëµ¥ÏPopup One ºÍPopup Two£©Òª±»»æ³öʱ

---- µ±´Ëµ¯³öʽ²Ëµ¥¼´Popup ±¾ÉíÒª±»»æ³öʱ

---- µÚÒ»ÖÖÇé¿öºÜºÃÀí½â£¬ÕýÈçÎÒÃÇÑ¡ÖÐTest menu ¶øItem One ºÍItem Two µÄ¸üк¯Êý»á×Ô¶¯Ö´ÐÐÒ»Ñù¡£µÚ¶þÖÖÇé¿öÆäʵҲºÜ×ÔÈ»£¬ÒòΪPopup ºÍItem One/Item Two ²»Ò»Ñù£¬ËüûÓÐID ºÅ£¬²»ÄÜÌí¼ÓÏûÏ¢Ó³ÏñÏÄÇôËüµÄ״̬ÈçºÎ¸üÐÂÄØ£¿ÓÚÊÇËüµÄµÚÒ»ÏîµÄ¸üк¯Êý±»µ÷Óã¬ÎªÁËÇø·ÖÊDz»Í¬µÄµ÷Óã¬Ëü½«CCmdUI µÄÀà³ÉÔ±±äÁ¿m_pSubMenu ÉèÖÃΪ²»Í¬µÄÖµ¡£ÔÚµÚÒ»ÖÖÇé¿öÏ£¬m_pSubMenu µÈÓÚNULL, µÚ¶þÖÖÇé¿öÏ£¬m_pSubMenu ²»µÈÓÚNULL¡£

---- ÒÔÏÂÎÒÃǸø³öÒ»¸öʵ¼ÊµÄ±à³Ì·¶Àý¡£ÓÉÓÚÆª·ù¹ØÏµ£¬ÎÒÃǽö½ö¸ø³öһЩ¹Ø¼üµÄÓï¾ä£¬ÆäÓàµÄÔòÒ»²¢ÂÔÈ¥¡£

---- ÔÚÍ·ÎļþµÄÀàÉùÃ÷ÖУº

BOOL m_bItemOne, m_bItemTwo, m_bPopupOne, m_bPopupTwo;
//ÓÃÓÚ¾ö¶¨¸÷¸ö²Ëµ¥ÏîµÄ״̬
protected:
afx_msg void OnUpdateMenuitemOne(CCmdUI* pCmdUI);
afx_msg void OnUpdateMenuitemTwo(CCmdUI* pCmdUI);
afx_msg void OnUpdatePopupOne(CCmdUI* pCmdUI);
afx_msg void OnUpdatePopupTwo(CCmdUI* pCmdUI);
//¸÷²Ëµ¥ÏîµÄ¸üк¯Êý
DECLARE_MESSAGE_MAP()

ÔÚÔ´ÎļþÖУº

BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
ON_UPDATE_COMMAND_UI (ID_ITEM_ONE,
OnUpdateMenuitemOne)
ON_UPDATE_COMMAND_UI (ID_ITEM_TWO,
OnUpdateMenuitemTwo)
ON_UPDATE_COMMAND_UI (ID_POPUP_ONE,
OnUpdatePopupOne)
ON_UPDATE_COMMAND_UI (ID_ POPUP_TWO,
OnUpdatePopupTwo)
END_MESSAGE_MAP()

void CMyApp::OnUpdatetMenuitemOne (CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bItemOne);
if(m_bItemOne) pCmdUI->SetText("Item One");
else pCmdUI->SetText("Item One is now disabled");
}

void CMyApp::OnUpdatetMenuitemTwo (CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bItemTwo);
if(m_bItemTwo) pCmdUI->SetText("Item Two");
else pCmdUI->SetText("Item Two is now disabled");
}

void CMyApp::OnUpdatePopupOne(CCmdUI* pCmdUI)
{
if (pCmdUI->m_pSubMenu != NULL)
{
BOOL b_Popup = m_bPopupOne || m_bPopupTwo;
pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex,
MF_BYPOSITION |
(bEnable ? MF_ENABLED :
(MF_DISABLED | MF_GRAYED)));
return;
}
pCmdUI->Enable(m_bPopupOne);
}

void CMyApp::OnUpdatePopupTwo(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bPopupTwo);
}


¡¾·¢±íÆÀÂÛ¡¿¡¾¹Ø±Õ´°¿Ú¡¿