【VC++6.0】有关菜单的一些使用技巧

 使菜单项前面加勾选的方法,在CMainFrame::OnCreate中添加代码
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++深入详解》

以上内容转自:http://apps.hi.baidu.com/share/detail/9827493

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值