1菜单与菜单项的操作

//获取菜单指针----CWnd::GetMenu()

//GetSubMenu()获取子菜单

/CheckMenuItem()加入/取消标记

GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MFS_CHECKED);

//创建缺省菜单SetDefaultItem()一个子菜单仅仅能有一个

//GetMenu()->GetSubMenu(0)->SetDefaultItem(1,1);

GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN);

//图形菜单的创建SetMenuItemBitmaps()

m_Bitmap.LoadBitmapW(IDB_BITMAP1);

GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_Bitmap,&m_Bitmap);

//使某项不能使用EnableMenuItem()

//NOTE: m_bAutoMenuEnable is set to FALSE in the constructor of 

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

//将整个菜单取消SetMenu()能够载入自己的菜单,若将Cmenu为局部变量则在setmenu后调用detach()

//SetMenu(NULL);

2MFC菜单项的更新

(1)为菜单某一项加入ON_UPDATE_COMMAND_UI消息并加入处理程式(在CMainframe类中)

(2)在处理程式中决定某一菜单项是否可用是否标记等(若涉及到工具栏中的菜单项则为保持与菜单项中的同步最好採用ID标记而不是位置)

(3)实例:void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI)

{

// TODO: 在此加入命令更新用户界面处理程序代码

pCmdUI->Enable();

}

3右击弹出菜单的使用

在VC++6.0中,在project -》addtoproject-》……之后进行选择就能够为工程加入一个单击右键弹出菜单功能。可是在VS中没有Pop-Up Menu组件,右键菜单须要手动加入。

加入方法例如以下:

1、在资源视图中加入所需的右键菜单

2、选择对应的类,单文档时选中View类在属性中加入WM_CONTEXTMENU消息

3、在OnContextMenu加入例如以下代码

void CMenuView::OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/Point)

{

// TODO: 在此处加入消息处理程序代码

if(Point.x==-1&&Point.y==-1)

{

CRect rect;

GetClientRect(rect);

ClientToScreen(rect);

Point=rect.TopLeft();

Point.Offset(5,5);

}

CMenu menu;

menu.LoadMenuW(IDR_MENU1);

CMenu* pPopup=menu.GetSubMenu(0);

ASSERT(pPopup!=NULL);

CWnd* PwndPopupOwner=this;

while (PwndPopupOwner->GetStyle()&WS_CHILD)

{

PwndPopupOwner=PwndPopupOwner->GetParent();

}

pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,Point.x,Point.y,PwndPopupOwner);



}

4动态加入菜单

在CMainframe::OnCreate()函数中

(1)CMenu::AppendMenu()将一个菜单项加入到现有菜单项末尾

(2)创建popup菜单CMmenu::CreatePopMenu();

(3)插入PopUpMenu菜单CMenu::InsertMenu()

(4)删除菜单CMenu::DeleteMenu()

(5)代码演示样例:

(6)对加入的菜单进行命令响应

手动加入消息响应函数和消息映射

(7)其它操作

void CMenuView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: 在此加入消息处理程序代码和/或调用默认值

static int indexm=313;

CClientDC dc(this);//获取客户区画布

if(0x0d==nChar)

{

if(0==index++)

{

m_Menu.CreatePopupMenu();

GetParent()->GetMenu()->AppendMenuW(MF_POPUP,(UINT)m_Menu.m_hMenu,_T("phonenote"));

//重绘菜单条CWnd::DrawMenuBar()

GetParent()->DrawMenuBar();//重绘菜单

}

m_Menu.AppendMenuW(MF_STRING,indexm++,m_PStr.Left(m_PStr.Find(' ')));

m_PStr.Empty();

Invalidate();//重绘画布

}





else

{

m_PStr+=(char)nChar;

dc.TextOutW(0,0,m_PStr);





}





CView::OnChar(nChar, nRepCnt, nFlags);

}

MFC之菜单的更多相关文章

  1. MFC中菜单变灰的问题

    MFC中菜单变灰 方法1:有UpdateCmdUI句柄时 定义一个BOOL变量m_b来标志菜单项是否有效, 该菜单项响应UPDATE_COMMAND_UI消息,在消息处理函数中pCmdUI->E ...

  2. 如何给MFC的菜单项添加快捷键

    我们一起分享,如何给MFC的菜单项添加快捷键.[程序在VC6.0编译环境下编译通过.(VS2010的编译环境大同小异)] 1.程序演示环境 1.1新建一个[对话框(Dialog)]的程序.然后,New ...

  3. VS MFC 添加菜单

    新建出来的基于对话框的MFC工程是没有菜单的,如何在对话框中添加菜单?又如何给菜单的菜单项添加事件应用响应?下面小编来具体描述一下,希望能帮助到一些人. 工具/原料   电脑一台 VS2010 方法/ ...

  4. MFC中菜单的命令响应顺序

    响应只可以由Doc,View,MainFrame以及APP四个类完成. 响应顺序是: 点击某菜单项,框架类最先接到菜单命令消息. 框架类把接收到得这个消息交给它的子窗口,即视图类. 视图类根据命令消息 ...

  5. mfc标题栏 菜单 退出 关机 重启

    隐藏标题栏 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStru ...

  6. MFC添加菜单资源与菜单执行函数的两种命令形式

    添加资源->新建一个菜单资源->选择相应的对话框 菜单的执行函数命令形式: COMMAD 是指点击菜单后的执行命令 UPDATE_COMMAND_UI 是指点击菜单后菜单状态的函数

  7. 关于MFC主菜单和右键弹出菜单

    一.主菜单.弹出菜单和右键菜单的概念: 主菜单是窗口顶部的菜单,一个窗口或对话框只能有一个主菜单,但是主菜单可以被更改(SetMenu()更改): 创建方式:CMenu::CreateMenu(voi ...

  8. MFC添加菜单事件

    双击draw.rc,就能看到.

  9. 图文详解MFC程序设置菜单快捷键

    原来觉得添加个快捷键就只要几分钟,上网搜索文章都写得很模糊, 只有这边文章不错. http://www.cplusplus.me/1263.html http://blog.sina.com.cn/s ...

随机推荐

  1. Java笔记之java.lang.String#trim

    String的trim()方法是使用频率频率很高的一个方法,直到不久前我不确定trim去除两端的空白符时对换行符是怎么处理的点进去看了下源码的实现,才发现String#trim的实现跟我想像的完全不一 ...

  2. MongoDB 之 Limit 选取 Skip 跳过 Sort 排序 MongoDB - 7

    我们已经学过MongoDB的 find() 查询功能了,在关系型数据库中的选取(limit),排序(sort) MongoDB中同样有,而且使用起来更是简单 首先我们看下添加几条Document进来 ...

  3. 如何得到Slave应用relay-log的时间

    官方社区版MySQL 5.7.19 基于Row+Position搭建的一主一从异步复制结构:Master->{Slave} ROLE HOSTNAME BASEDIR DATADIR IP PO ...

  4. C++产生固定范围内的固定数量的随机数

    #include<iostream> #include<ctime> #include<random> using namespace std; void knut ...

  5. 全国大学API接口分享

    1.获取省份列表: http://119.29.166.254:9090/api/provinces 返回的是省份列表,其中id很重要. 2.通过省份id查询省份城市: http://119.29.1 ...

  6. eclipse导入导出工作空间配置

    首先,导出T1中的配置:打开T1,选择fileExport 在弹出框中选择General 下的preferencenext在export preferences 页面选择export all, 点Br ...

  7. 001_关于选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘。问题解决

    问题: 今天我的diy电脑重装系统时,遇到了一个棘手的问题.在选择安装分区的时候,提示有这样的错误. Windows 无法安装到这个磁盘.选中的磁盘具有MBR分区表.在 EFI 系统上,Windows ...

  8. APMServ5.2.6win10系统Apache、MySQL5.1启动失败解决办法

    今天想在本地测试网站源码能否正常运行,如果可以就转空间了,然而下载了APMServ之后发现系统Apache.MySQL5.1启动均失败,小白的人表示只能借助百度,用了一个小时的时间终于解决了,虽然坎坷 ...

  9. MySQL的聚集索引和非聚集索引

    一. MYSQL的索引 mysql中,不同的存储引擎对索引的实现方式不同,大致说下MyISAM和InnoDB两种存储引擎. MyISAM的B+Tree的叶子节点上的data,并不是数据本身,而是数据存 ...

  10. Shell 利用 curl 模拟登陆

    -b 参数 指定使用cookie文件 -c是往cookie文件中写cookie -d 是指定此次登录所需的参数,通过httpfox查看 -L 指定页面自动跳转 #curl -c ck.txt --us ...