GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND | MF_CHECKED);
设置菜单缺省项
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);
在菜单项前面加图标
(1) 在MainFrm.h中添加成员变量
private:
CBitmap m_bitmap;
(2) 在CMainFrame::OnCreate中添加代码
m_bitmap.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP1是自己添加的位图的ID
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);
使菜单项变灰且不能使用的代码:
(1) 在CMainFrame构造函数中添加代码
m_bAutoMenuEnable=FALSE;
(2) 在CMainFrame::OnCreate中添加代码
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
以上表示在最左边第一排的第2个菜单项不能使用
使菜单项中的剪切按钮不能够使用的代码:在ClassWizard的Object IDs:ID_EDIT_CUT中增加一个Message->UPDATE_COMMAND_UI->ADD FUNCTION...
在CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI)中添加如下代码
{
if(ID_EDIT_CUT==pCmdUI->m_nID)
pCmdUI->Enable(FALSE);
//pCmdUI->Enable();使剪切按钮能使用
}
将当前的菜单销毁:
SetMenu(NULL);
重建菜单:
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);//IDR_MAINFRAME是在资源视图中菜单的ID号
SetMenu(&menu);
menu.Detach();//这可以保证在窗口关闭时菜单才发生析构。当然,也可以将菜单变量menu定义为成员变量
添加View窗口的鼠标右键菜单
(1) 新建一个单文档工程,取名为menu
(2) 找到资源视图,在Menu上点击右键,选择Insert menu
(3) 在右边的菜单编辑器中将鼠标移到虚线框中点击右键,选择properties,在Caption中随便填一个标识(这个标识是不会显现出来的)
(4) 在自动新建的虚线框中点击右键,选择Properties,ID填IDM_SHOW,Caption填"显示"
(5) 在随后自动新建的虚线框中点击右键,选择Properties,ID填IDM_Exit,Caption填"退出"
(6) 捕获消息:在CMenuView中点击右键,选择Add Windows Message Handler...-->找到并选择WM_RBUTTONDOWN-->点击Add And Exit
(7) 在随后出现的CMenuView::OnRButtonDown(UINT nFlags, CPoint point)中添加以下代码:
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pPopup=menu.GetSubMenu(0);
ClientToScreen(&point);//将屏幕坐标转换为客户区坐标,如果没有这一句,那么右键菜单出现的位置是从屏幕左上角起算的
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
GetParent());
CView::OnRButtonDown(nFlags, point);
(8) 捕获右键消息响应函数:资源视图-->IDR_MENU1(这是我们创建的菜单自动命的名)-->在“显示”上单击右键,选择ClassWizard-->在Adding a Class窗口中点“Cancel”-->Object IDs选择为IDM_SHOW,Class Name选择为CMenuView-->Messages中单击Command-->点击Add Functions在CMenuView::OnShow()中添加以下代码:
MessageBox("View Show!");
采用代码方式创建和添加动态的菜单或菜单项
(1) 新建一个单文档工程,取名为menu
(2) 在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中的最后面(即在框架窗口创建完成之后)添加以下代码
CMenu menu;
menu.CreatePopupMenu();
//GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"WinSun");//最末尾添加一个菜单项,MF_POPUP表示是一个弹出菜单
GetMenu()->InsertMenu(2,MF_BYPOSITION | MF_POPUP,(UINT)menu.m_hMenu,"WinSun2");//插入一个菜单项
menu.AppendMenu(MF_STRING,111,"Hello");
menu.AppendMenu(MF_STRING,112,"Weixin");
menu.AppendMenu(MF_STRING,113,"Mybole");//在当前插入的弹出菜单中添加三个菜单项,111、112、113为我们自定义的ID号
GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,"Welcome");
GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,
MF_BYCOMMAND | MF_STRING,115,"维新"); //在文件弹出菜单中末尾添加菜单项
GetMenu()->DeleteMenu(1,MF_BYPOSITION);//删除“编辑”弹出菜单
GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);//删除“文件”弹出菜单中的第3个菜单项(“打开”菜单项)
menu.Detach();
return 0;
注:如果我们在FileView视图->Resource.h中定义了一个ID号,比如
#define IDM_HELLO 111
则以上
menu.AppendMenu(MF_STRING,111,"Hello");
可以改为
menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");
(3) Hello消息响应函数的填写
假设我们已经定义了IDM_HELLO为111,下面我们要对这个Hello菜单项添加消息响应函数,一共有三个步骤,分别为:
1) 在头文件当中做命令响应函数原型:在类视图中双击CMainFrame,打开MainFrm.h,在
// Generated message map functions
protected:
中添加以下代码:
afx_msg void OnHello();//OnHello这个名字也可以换成别的
DECLARE_MESSAGE_MAP() //这个是自动生成的代码
2) 消息映射:双击CMainFrame(),在打开的MainFrm.cpp中找到
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(IDM_TESt, OnTESt)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
在以上的
//}}AFX_MSG_MAP
和
END_MESSAGE_MAP()
之间添加以下代码:
ON_COMMAND(IDM_HELLO,OnHello) //注意,这里不要加分号
3) 最后,在MainFrm.cpp中添加以下函数代码
void CMainFrame::OnHello()
{
MessageBox("Hello!");
}
创建一个模态对话框和一个非模态对话框的代码:
CTestDlg dlg;
dlg.DoModal();//创建一个模态对话框
CTestDlg *pDlg=new CTestDlg();
pDlg->Create(IDD_DIALOG1,this);
pDlg->ShowWindow(SW_SHOW);//创建一个非模态对话框
注1:CTestDlg是自己定义的一个对话框类
注2:在这里pDlg是一个局部变量,当生命周期结束后pDlg所指向的内存无法再被引用,解决方法:可以把pDlg设为一个相关类的成员变量
来自孙鑫《VC++深入详解》