- 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对象和一个有效窗口的联系。
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对象和一个有效窗口的联系。
- /*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!");
- }
/*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!");
}
- /*
- demo12(在框架类中截获本由视类完成的消息处理)
- 在框架类中重写虚函数OnCommand()
- */
- BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
- {
- // TODO: Add your specialized code here and/or call the base class
- int MenuCmdId = LOWORD(wParam);//获取命令ID
- /*
- CString str;
- str.Format("%d",MenuCmdId);
- MessageBox(str);
- */
- CMenu3View *pView = (CMenu3View *)GetActiveView();//获取View类指针
- if(MenuCmdId>=IDM_PHONE1 && MenuCmdId<IDM_PHONE1+pView->m_strArray.GetSize())
- {
- CClientDC dc(pView);
- dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));
- return TRUE;//执行完后直接返回,View不会再响应
- }
- return CFrameWnd::OnCommand(wParam, lParam);//基类完成消息路由
- }