MFC菜单、子菜单、菜单项的控制

  1. CMenu::CMenu   
  2. CMenu( );  
  3.   
  4.   
  5. CMenu::LoadMenu //加载一个菜单   
  6. BOOL LoadMenu( LPCTSTR lpszResourceName );  
  7.   
  8.   
  9. CWnd::GetMenu  //获取菜单栏   
  10. CMenu* GetMenu( ) const;  
  11.   
  12. CMenu::CreatePopupMenu //创建弹出菜单(顶层菜单)   
  13. BOOL CreatePopupMenu( );  
  14.   
  15.   
  16.   
  17. CMenu::GetSubMenu   //获取子菜单   
  18. CMenu* GetSubMenu( int nPos ) const;  
  19.   
  20. CMenu::CheckMenuItem //该函数取得与指定菜单项相联系的菜单标志   
  21. UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );  
  22.   
  23.   
  24. CMenu::SetDefaultItem //设定缺省菜单   
  25. BOOL SetDefaultItem( UINT uItem, BOOL fByPos = FALSE );  
  26.   
  27. CMenu::SetMenuItemBitmaps //设定图形标记菜单   
  28. BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );  
  29.   
  30.   
  31.   
  32. int GetSystemMetrics(  
  33.   int nIndex   // system metric or configuration setting   
  34. );  
  35.   
  36.   
  37. CMenu::EnableMenuItem //允许、禁止或变灰指定的菜单项   
  38. UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );  
  39.   
  40.   
  41. CWnd::SetMenu   //将当前菜单设为指定的菜单,也可用来清除菜单(NULL),但不会销毁菜单   
  42. BOOL SetMenu( CMenu* pMenu );  
  43.   
  44. /* 
  45. CCmdUI没有基类。 
  46. 它仅在一个CCmdTarget派生类的ON_UPDATE_COMMAND_UI处理程序中使用。 
  47. 当用户在应用的下拉菜单时,要确定每个菜单项的显示状态——允许存取或禁止存取。 
  48. 菜单命令的目标通过实现一个ON_UPDATE_COMMAND_UI处理来提供这些信息。 
  49. 可以使用ClassWizard来浏览定位应用中的命令用户接口对象,然后为它建立一个消息映射入口, 
  50. 并为每个消息处理函数提供函数原型。 
  51. */  
  52.   
  53. CWnd::ClientToScreen  //客户区坐标转换为屏幕坐标   
  54. void ClientToScreen( LPPOINT lpPoint ) const;  
  55. void ClientToScreen( LPRECT lpRect ) const;  
  56.   
  57.   
  58. CMenu::TrackPopupMenu //指定位置显示快捷菜单   
  59. BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );  
  60.   
  61.   
  62. /*动态菜单操作*/  
  63. CMenu::InsertMenu   
  64. BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );  
  65. BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );  
  66.   
  67. CMenu::AppendMenu   
  68. BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );  
  69. BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );  
  70.   
  71.   
  72. CMenu::DeleteMenu   
  73. BOOL DeleteMenu( UINT nPosition, UINT nFlags );  
  74.   
  75. detach()函数  
  76. //MFC类里CMENU类的成员函数。功能是切断一个CWnd对象和一个有效窗口的联系。  
CMenu::CMenu 
CMenu( );


CMenu::LoadMenu //加载一个菜单
BOOL LoadMenu( LPCTSTR lpszResourceName );


CWnd::GetMenu  //获取菜单栏
CMenu* GetMenu( ) const;

CMenu::CreatePopupMenu //创建弹出菜单(顶层菜单)
BOOL CreatePopupMenu( );



CMenu::GetSubMenu   //获取子菜单
CMenu* GetSubMenu( int nPos ) const;

CMenu::CheckMenuItem //该函数取得与指定菜单项相联系的菜单标志
UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );


CMenu::SetDefaultItem //设定缺省菜单
BOOL SetDefaultItem( UINT uItem, BOOL fByPos = FALSE );

CMenu::SetMenuItemBitmaps //设定图形标记菜单
BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );



int GetSystemMetrics(
  int nIndex   // system metric or configuration setting
);


CMenu::EnableMenuItem //允许、禁止或变灰指定的菜单项
UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );


CWnd::SetMenu   //将当前菜单设为指定的菜单,也可用来清除菜单(NULL),但不会销毁菜单
BOOL SetMenu( CMenu* pMenu );

/*
CCmdUI没有基类。
它仅在一个CCmdTarget派生类的ON_UPDATE_COMMAND_UI处理程序中使用。
当用户在应用的下拉菜单时,要确定每个菜单项的显示状态——允许存取或禁止存取。
菜单命令的目标通过实现一个ON_UPDATE_COMMAND_UI处理来提供这些信息。
可以使用ClassWizard来浏览定位应用中的命令用户接口对象,然后为它建立一个消息映射入口,
并为每个消息处理函数提供函数原型。
*/

CWnd::ClientToScreen  //客户区坐标转换为屏幕坐标
void ClientToScreen( LPPOINT lpPoint ) const;
void ClientToScreen( LPRECT lpRect ) const;


CMenu::TrackPopupMenu //指定位置显示快捷菜单
BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );


/*动态菜单操作*/
CMenu::InsertMenu 
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );

CMenu::AppendMenu 
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );


CMenu::DeleteMenu 
BOOL DeleteMenu( UINT nPosition, UINT nFlags );

detach()函数
//MFC类里CMENU类的成员函数。功能是切断一个CWnd对象和一个有效窗口的联系。





  1. /*demo1(为菜单项打标记) 
  2.  
  3. 在框架类的OnCreate()中添加如下代码: 
  4. */  
  5.   
  6. GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_CHECKED|MF_BYPOSITION );//通过位置索引   
  7. GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_OPEN,MF_CHECKED|MF_BYCOMMAND);//通过命令ID索引   
  8.   
  9.   
  10. /*demo2(设定缺省菜单) 
  11. 在框架类的OnCreate()中添加如下代码: 
  12. */  
  13.   
  14. /*GetMenu()->GetSubMenu(0)->SetDefaultItem(2,TRUE);//通过位置索引*/  
  15. GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_SAVE_AS,FALSE);//通过命令ID索引   
  16.   
  17.   
  18. /* 
  19. demo3(图形标记菜单) 
  20. 在框架类的OnCreate()中添加如下代码: 
  21. */  
  22. CBitmap *bitmap=new CBitmap();  
  23. bitmap->LoadBitmap(IDB_BITMAP1);  
  24. GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,bitmap,bitmap);  
  25.   
  26.   
  27. /* 
  28. demo4(获取系统指定菜单位图大小) 
  29. 在框架类的OnCreate()中添加如下代码: 
  30. */  
  31.   
  32. CString str;  
  33. str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));  
  34. MessageBox(str);  
  35.   
  36.   
  37. /* 
  38. demo5(允许、禁止或变灰指定的菜单项) 
  39. 构造函数中初始化m_bAutoMenuEnable = FALSE; 
  40. 在框架类的OnCreate()中添加如下代码: 
  41. */  
  42.   
  43. GetMenu()->GetSubMenu(0)->EnableMenuItem(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);  
  44.   
  45. CMenu* mmenu = GetMenu();  
  46. CMenu* submenu = mmenu->GetSubMenu(0);  
  47. submenu->EnableMenuItem(ID_FILE_OPEN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);  
  48.   
  49. /* 
  50. demo6(消除和加载菜单) 
  51. 在框架类的OnCreate()中添加如下代码: 
  52. */  
  53. SetMenu(NULL);  
  54. CMenu menu;  
  55. menu.LoadMenu(IDR_MAINFRAME);  
  56. SetMenu(&menu);  
  57. menu.Detach();//使局部变量menu不被析构,也可以申请堆内存或者把menu设置为成员变量   
  58.   
  59.   
  60. /* 
  61. demo7(捕获ON_UPDATE_COMMAND_UI消息更新菜单) 
  62.  
  63. 选择ClassWizard”菜单项,在出现的界面中,选择Class Name为“CMainFrame”, 
  64. 增加成员函数,Object Ids、Messages、Member functions分别为: 
  65. ID_EDIT_CUT、UPDATE_COMMAND_UI、OnUpdateEditCut() 
  66. EditCode: 
  67. */  
  68. void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI)   
  69. {  
  70. //  if(2==pCmdUI->m_nIndex)//工具栏不会被关联   
  71.     if(ID_EDIT_CUT==pCmdUI->m_nID)//工具栏会被关联,工具栏和菜单栏ID号一致   
  72.         pCmdUI->Enable(TRUE);//剪切菜单项设置为允许   
  73. }  
  74.   
  75.   
  76. /* 
  77. demo8(创建一个非弹出式菜单项) 
  78.  
  79. 在ResourceView中编辑Menu目录下的IDR_MAINFRAME,添加一个新的菜单项,不选择弹出。 
  80. 选择ClassWizard”菜单项,在出现的界面中,选择Class Name为“CMainFrame”, 
  81. 增加成员函数,Object Ids、Messages、Member functions分别为: 
  82. ID_TEST、COMMAND、OnTest() 
  83. EditCode: 
  84. */  
  85. void CMainFrame::OnTest()   
  86. {  
  87.         AfxMessageBox("MainFrame Clicked!");  
  88. }  
  89.   
  90.   
  91.   
  92. /* 
  93. demo9(创建弹出快捷键菜单) 
  94. 在ResourceView中编辑Menu目录下插入一个新的菜单资源。 
  95. 在View类中添加WM_RBUTTONDOWN消息响应函数 
  96. EditCode: 
  97. */  
  98.   
  99. void CMenuView::OnRButtonDown(UINT nFlags, CPoint point)   
  100. {  
  101.     // TODO: Add your message handler code here and/or call default   
  102.     CMenu menu;  
  103.     menu.LoadMenu(IDR_MENU1);  
  104.     CMenu *pPopup = menu.GetSubMenu(0);  
  105.   
  106.     ClientToScreen(&point);//客户区坐标转换为屏幕坐标   
  107.     pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);  
  108.     //用this指针,只能让view类进行目录项命令响应,如果要框架类窗口也响应,则用GetParent()   
  109.   
  110.     CView::OnRButtonDown(nFlags, point);  
  111. }  
  112.   
  113.   
  114.   
  115. /* 
  116. demo10(动态控制菜单) 
  117. 在框架类中的OnCreat()函数中添加如下代码。 
  118. EditCode: 
  119. */  
  120.   
  121. CMenu menu;  
  122. menu.CreatePopupMenu();//创建弹出菜单   
  123. GetMenu()->AppendMenu(MF_POPUP, (UINT)menu.m_hMenu,"SYAU");//添加子菜单(弹出菜单MF_POPUP类型对应着子菜单的句柄)   
  124. GetMenu()->InsertMenu(2,MF_BYPOSITION|MF_POPUP, (UINT)menu.m_hMenu,"SYAU");//插入子菜单   
  125. menu.AppendMenu(MF_STRING,111,"MFC1");//添加菜单项(菜单项MF_STRING类型对应着菜单项的ID)   
  126. menu.AppendMenu(MF_STRING,112,"MFC2");  
  127. menu.AppendMenu(MF_STRING,113,"MFC3");  
  128. menu.Detach();  
  129. GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,"welcome");//添加菜单项   
  130. GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,MF_BYCOMMAND|MF_STRING,115,"MFC");//插入菜单项   
  131. //GetMenu()->DeleteMenu(1,MF_BYPOSITION);//删除子菜单   
  132. //GEtMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);//删除菜单项   
  133.   
  134.   
  135. //demo11(在动态添加的菜单中进行命令响应)   
  136.   
  137. //在文件视图的Resource.h中,添加菜单项的ID号:   
  138. #define IDM_MFC1   111   
  139.   
  140. //在MainFrm.h的中添加消息的原型:   
  141. protected:  
  142. //{{AFX_MSG(CMainFrame)   
  143. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);  
  144. afx_msg void OnEditCut();  
  145. //}}AFX_MSG   
  146. afx_msg void OnMfc1();  
  147. DECLARE_MESSAGE_MAP()  
  148.   
  149. //在MainFrm.cpp中添加消息映射:   
  150. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)  
  151. //{{AFX_MSG_MAP(CMainFrame)   
  152. ON_WM_CREATE()  
  153. ON_COMMAND(ID_EDIT_CUT, OnEditCut)  
  154.       
  155. //}}AFX_MSG_MAP   
  156. ON_COMMAND(IDM_MFC1, OnMfc1)  
  157.       
  158. END_MESSAGE_MAP()  
  159.   
  160. //在MainFrm.cpp中添加函数的实现:   
  161.   
  162. void CMainFrame::OnMfc1()   
  163. {  
  164.     MessageBox("MFC1 clicked!");  
  165. }  
/*demo1(为菜单项打标记)

在框架类的OnCreate()中添加如下代码:
*/

GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_CHECKED|MF_BYPOSITION );//通过位置索引
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_OPEN,MF_CHECKED|MF_BYCOMMAND);//通过命令ID索引


/*demo2(设定缺省菜单)
在框架类的OnCreate()中添加如下代码:
*/

/*GetMenu()->GetSubMenu(0)->SetDefaultItem(2,TRUE);//通过位置索引*/
GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_SAVE_AS,FALSE);//通过命令ID索引


/*
demo3(图形标记菜单)
在框架类的OnCreate()中添加如下代码:
*/
CBitmap *bitmap=new CBitmap();
bitmap->LoadBitmap(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,bitmap,bitmap);


/*
demo4(获取系统指定菜单位图大小)
在框架类的OnCreate()中添加如下代码:
*/

CString str;
str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));
MessageBox(str);


/*
demo5(允许、禁止或变灰指定的菜单项)
构造函数中初始化m_bAutoMenuEnable = FALSE;
在框架类的OnCreate()中添加如下代码:
*/

GetMenu()->GetSubMenu(0)->EnableMenuItem(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);

CMenu* mmenu = GetMenu();
CMenu* submenu = mmenu->GetSubMenu(0);
submenu->EnableMenuItem(ID_FILE_OPEN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);

/*
demo6(消除和加载菜单)
在框架类的OnCreate()中添加如下代码:
*/
SetMenu(NULL);
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach();//使局部变量menu不被析构,也可以申请堆内存或者把menu设置为成员变量


/*
demo7(捕获ON_UPDATE_COMMAND_UI消息更新菜单)

选择ClassWizard”菜单项,在出现的界面中,选择Class Name为“CMainFrame”,
增加成员函数,Object Ids、Messages、Member functions分别为:
ID_EDIT_CUT、UPDATE_COMMAND_UI、OnUpdateEditCut()
EditCode:
*/
void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI) 
{
//	if(2==pCmdUI->m_nIndex)//工具栏不会被关联
	if(ID_EDIT_CUT==pCmdUI->m_nID)//工具栏会被关联,工具栏和菜单栏ID号一致
		pCmdUI->Enable(TRUE);//剪切菜单项设置为允许
}


/*
demo8(创建一个非弹出式菜单项)

在ResourceView中编辑Menu目录下的IDR_MAINFRAME,添加一个新的菜单项,不选择弹出。
选择ClassWizard”菜单项,在出现的界面中,选择Class Name为“CMainFrame”,
增加成员函数,Object Ids、Messages、Member functions分别为:
ID_TEST、COMMAND、OnTest()
EditCode:
*/
void CMainFrame::OnTest() 
{
		AfxMessageBox("MainFrame Clicked!");
}



/*
demo9(创建弹出快捷键菜单)
在ResourceView中编辑Menu目录下插入一个新的菜单资源。
在View类中添加WM_RBUTTONDOWN消息响应函数
EditCode:
*/

void CMenuView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CMenu menu;
	menu.LoadMenu(IDR_MENU1);
	CMenu *pPopup = menu.GetSubMenu(0);

	ClientToScreen(&point);//客户区坐标转换为屏幕坐标
	pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
	//用this指针,只能让view类进行目录项命令响应,如果要框架类窗口也响应,则用GetParent()

	CView::OnRButtonDown(nFlags, point);
}



/*
demo10(动态控制菜单)
在框架类中的OnCreat()函数中添加如下代码。
EditCode:
*/

CMenu menu;
menu.CreatePopupMenu();//创建弹出菜单
GetMenu()->AppendMenu(MF_POPUP, (UINT)menu.m_hMenu,"SYAU");//添加子菜单(弹出菜单MF_POPUP类型对应着子菜单的句柄)
GetMenu()->InsertMenu(2,MF_BYPOSITION|MF_POPUP, (UINT)menu.m_hMenu,"SYAU");//插入子菜单
menu.AppendMenu(MF_STRING,111,"MFC1");//添加菜单项(菜单项MF_STRING类型对应着菜单项的ID)
menu.AppendMenu(MF_STRING,112,"MFC2");
menu.AppendMenu(MF_STRING,113,"MFC3");
menu.Detach();
GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,"welcome");//添加菜单项
GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,MF_BYCOMMAND|MF_STRING,115,"MFC");//插入菜单项
//GetMenu()->DeleteMenu(1,MF_BYPOSITION);//删除子菜单
//GEtMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);//删除菜单项


//demo11(在动态添加的菜单中进行命令响应)

//在文件视图的Resource.h中,添加菜单项的ID号:
#define IDM_MFC1   111

//在MainFrm.h的中添加消息的原型:
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnEditCut();
//}}AFX_MSG
afx_msg void OnMfc1();
DECLARE_MESSAGE_MAP()

//在MainFrm.cpp中添加消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
	
//}}AFX_MSG_MAP
ON_COMMAND(IDM_MFC1, OnMfc1)
	
END_MESSAGE_MAP()

//在MainFrm.cpp中添加函数的实现:

void CMainFrame::OnMfc1() 
{
	MessageBox("MFC1 clicked!");
}

  1. /* 
  2. demo12(在框架类中截获本由视类完成的消息处理) 
  3. 在框架类中重写虚函数OnCommand() 
  4. */  
  5. BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)   
  6. {  
  7.     // TODO: Add your specialized code here and/or call the base class   
  8.     int MenuCmdId = LOWORD(wParam);//获取命令ID   
  9. /* 
  10.     CString str; 
  11.     str.Format("%d",MenuCmdId); 
  12.     MessageBox(str); 
  13. */  
  14.     CMenu3View *pView = (CMenu3View *)GetActiveView();//获取View类指针   
  15.       
  16.     if(MenuCmdId>=IDM_PHONE1 && MenuCmdId<IDM_PHONE1+pView->m_strArray.GetSize())  
  17.     {  
  18.             CClientDC dc(pView);  
  19.             dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));  
  20.             return TRUE;//执行完后直接返回,View不会再响应   
  21.     }  
  22.   
  23.     return CFrameWnd::OnCommand(wParam, lParam);//基类完成消息路由   
  24. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值