vc入门宝典(一)(菜单)
菜单
菜单项属性说明:
ID 标识菜单的唯一常量。
Caption 菜单项标题,“&" 后面的字符为快捷键,在菜单项后的字符将加下划线。
Separator 水平线,其它属性无效。
Pop_up 有子菜单
Grayed 无效,标题以灰色显示
Inactive 无效,标题正常显示
Checked 在标题前加一个对钩
break 为None时,使它和它的兄弟们一行或一列显示。
Help 只对最上层菜单项有效,使它及后面的最上层菜单移到窗口的右上角。
Prompt 当鼠标指向它时的提示信息
多文档应用程序除了生成IDR_MAINFRAME外,还生成标识符为IDR_xxxxTYPE,其中xxxx为应用程序名。它们分别对应无文档和有文档时。
一个菜单id可以在多个类有响应函数,但只会有一个响应。
我实验得出的结果,CChildFrame,CCMenuApp,CCMenuDoc,CCMenuView,CMainFrame(我的应用程序名为CMenu)的响应顺序为:
在IDR_MAINFRAME中,CMainFrame,CCMenuApp其它三个不响应.
在IDR_XXXXTYPE 中,CCMenuView,CCMenuDoc,CChildFrame,CCMenuApp,CMainFrame.
ctrl+w打开ClassWizard,选好工程,类(最常选的是xxxView),在id中选择我们要修改的菜单项。
双击COMMAND(或UPDATE_COMMAND_UI)点确定就可以了。再在成员函数中双击我们刚刚加的函数,就可以编辑函数了。
当用户单击菜单时,我们刚刚编辑的函数会执行。
如果我们双击的是UPDATA_COMMAND_UI,则响应形式类似如下:
void ... OnUpdate...(CCmdUI * pCmdUI)
{
pCmdUI->SetCheck(true);//在菜单项前加一个对钩
pCmdUI->Enable(true);// 使菜单项能够使用
}
因为此函数往往影响到它的外形,故在它的“父亲”或“祖父”被选中时就会执行。
CWnd类中与菜单有关的几个函数。
SetMeun(CMenu *pMenu);
修改窗口的菜单,为NULL,则表示删除。
常用的还有
GetMenu();
GetSystemMenu();
CMenu的一些函数。
AppendMenu()函数指定的菜单最后附加一个新菜单项,同时可以指定菜单项的相关情况,它有两个语法。
nFlag指定状态,可以是以下四组之一或相组合而成,还可以与MF_POPUP组合表示添加的是弹出式菜单。
MF_CHECKED,MF_CHECKED
MF_DISABLED,MF_ENABLED,MF_GRAYED
MF_STRING,MF_OWNERDRAW,MF_SEPARATOR,MF_BITMAP菜单项是字符串,自画型,分隔线,位图。
MF_MENUBARBREAK,MF_MENUBREAK
nIDNewItem 指定菜单项的id.
lpszNewItem指定菜单项的内容,与nFlag有关。为MF_OWNERDRAW时,该参数为数据指针,用来传送数据,系统在发送消息WM_MEASUREITEM和WM_DRAWITEM时将该数据存入参数
的(DRAWITEMSTRUCT结构)itemData域;nFlag为MF_STRING时该参数为菜单标题。
InsertMenu
nFlags指定菜单项位置和状态,状态选项参见AppendMenu()函数,位置选项为MF_BYCOMMAND,MF_BYPOSITION.
nPositin若为MF_BYCOMMAND,新菜单项插在指定菜单项之前;或为MF_BYPOSITION,该参数指定新菜单项的位置,为-1插到最后。
ModifyMenu()参数与InsertMenu类似。
DeleteMenu删除菜单项
RemoveMenu移去菜单项
设置和显示浮动菜单
BOOL TrackPopupMenu(UINT nFlags,int x,int y,
CWnd *pWnd,LPCRECT = NULL);
nFlag浮动式菜单坐标设定方式及鼠标操作方式,有效值如下:
TPM_CENTERALIGN TPM_LEFTALIGN TPM_RIGHTALIGN
TPM_LEFTBUTTON TPM_RIGHTBUTTON
x,y浮动式菜单坐标
pWnd指定操作菜单的窗口
lpRect指定鼠标操作范围
在客户区单击左键就会弹出快捷菜单,方法二需要在资源编辑器中编辑一个新菜单,方法三必须有主菜单。
方法一:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CMenu PopupMenu;
PopupMenu.CreatePopupMenu();
PopupMenu.AppendMenu(MF_STRING,ID_FILE_NEW,"NEW..");
//...
ClientToScreen(&point);
PopupMenu.TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CView::OnLButtonDown(nFlags, point);
}
方法二:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_DUMMY);
CMenu *pMenu=menu.GetSubMenu(0);
ASSERT(pMenu!=NULL);
ClientToScreen(&point);
pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
CView::OnLButtonDown(nFlags, point);
}
方法三:
void CHeView::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd *pWnd=AfxGetApp()->GetMainWnd();
CMenu * pMenu=pWnd->GetMenu();
pMenu=pMenu->GetSubMenu(0);
ASSERT(pMenu!=NULL);
ClientToScreen(&point);
pMenu->TrackPopupMenu(TPM_CENTERALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
}
习题:
动态菜单,用户点击“更多菜单”,增加一些菜单项。
其实,自画菜单原理不难理解.AppendMenu的风格选自画,将自画用的信息(指针)强制转化成LPCTSTR,再重
载DrawItem就行了,注意自画用的信息不要提前delete了.
示例如下:
COwnerMenu.h中
class CMenuItem
{
public:
CString m_szText;
COLORREF m_color;
CMenuItem(CString szText,COLORREF color)
{
m_szText = szText;
m_color = color;
}
};
#include <afxtempl.h>
class COwnerMenu : public CMenu
{
public:
void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
bool AppendMenu(UINT nIDNewItem,CString caption,COLORREF color);
COwnerMenu();
CTypedPtrList<CPtrList,CMenuItem *> m_MenuList;
virtual ~COwnerMenu();
};
COwnerMenu.cpp中
COwnerMenu::~COwnerMenu()
{
while(m_MenuList.GetCount())
{
CMenuItem *pMenuItem = m_MenuList.GetHead();
delete pMenuItem;
m_MenuList.RemoveHead();
}
}
bool COwnerMenu::AppendMenu(UINT nIDNewItem, CString caption, COLORREF color)
{
CMenuItem * pMenuItem = new CMenuItem(caption,color);
m_MenuList.AddTail(pMenuItem);
return CMenu::AppendMenu(MF_OWNERDRAW,nIDNewItem,(LPCTSTR)pMenuItem);
}
void COwnerMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
pDC->SetTextColor(((CMenuItem*)lpDrawItemStruct->itemData)->m_color);
pDC->TextOut(0,0,((CMenuItem*)lpDrawItemStruct->itemData)->m_szText);
}
在使用菜单的地方(不要忘记了加头文件):
void COwnerMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{
COwnerMenu menu;
menu.CreatePopupMenu();
menu.AppendMenu(ID_1,"1",RGB(0,0,128));
ClientToScreen(&point);
menu.TrackPopupMenu(TPM_LEFTBUTTON|TPM_LEFTALIGN,point.x,point.y,this);
CView::OnRButtonDown(nFlags, point);
}
vc入门宝典(一)(菜单)的更多相关文章
- VC++实现生成右键菜单及添加图标
用VC++实现弹出菜单比较简单,这里介绍其中的一种来实现一个鼠标右键弹出菜单,效果如下图所示: 步骤: 一.新建一个基于对话框的MFC应用程序-----PopMenu 二.添加一个菜单资源------ ...
- 数据治理之元数据管理的利器——Atlas入门宝典
随着数字化转型的工作推进,数据治理的工作已经被越来越多的公司提上了日程.作为Hadoop生态最紧密的元数据管理与发现工具,Atlas在其中扮演着重要的位置.但是其官方文档不是很丰富,也不够详细.所以整 ...
- 原创:从零开始,微信小程序新手入门宝典《一》
为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习:一:微信小程序的特点张小龙:张小龙全面阐述小程序,推荐通读此文: 小程序是一种不需要下载.安装即可使用的 ...
- git 入门宝典
本篇教程是按照我自己的组织方式,然后从多篇教程中拼凑出来的,嘎嘎~,真佩服自己的技术! 原本想叫 git 宝典的,结果一查git的命令大全,还有那么多的git命令与功能没有接触到,所以...还是谦虚一 ...
- 史诗手册!微信小程序新手自学入门宝典!
一.小程序官方指南 1:官方开发工具下载: https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=201714 0.12 ...
- emacs 入门教程,菜单汉化,配置文件等杂乱文章
首先来一发ArchWiki的Emacs简体中文的入门教程 https://wiki.archlinux.org/index.php/Emacs_(%E7%AE%80%E4%BD%93%E4%B8%AD ...
- 从零开始:微信小程序新手入门宝典《一》
为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习: 一:微信小程序的特点 张小龙:张小龙全面阐述小程序,推荐通读此文: 小程序是一种不需要下载.安装即可使 ...
- [译]:Orchard入门——导航与菜单
原文链接:Navigation and Menus 文章内容基于Orchard1.8版本.同时包含Orchard 1.5之前版本的导航参考 Orchard有许多不同的方法来创建菜单.本文将介绍两种较为 ...
- 【Unity3d游戏开发】UGUI插件入门之游戏菜单
ugui是unity4.6开始加入的一个新的ui系统,非常强大,下面我们将通过一系列博客的方式一起来学习一下ugui的使用.本篇博客会介绍如何使用ugui制作一个游戏菜单,并且了解如何让物体与ugui ...
- VC中如何设置菜单项的触发状态?
MFC中初始菜单栏如下: 当工程未新建,或者未打开时,后面的观测菜单设置为灰色,不可触发. 当新建工程或者打开工程后,菜单变回可触发状况. 观测菜单如下: 下面以轴力观测菜单为例 轴力初始测量菜单 ...
随机推荐
- longchain4j 学习系列(1)-ollama本地调用
longchain4j是比spring-ai更早出现的大模型相关工程开源框架,社区成熟,活跃度高.下面演示如何用longchain4j调用本地ollama 一.核心pom依赖 1 <!-- Lo ...
- 在 docker 中设置容器自动启动---九五小庞
1.使用 docker run 命令运行时 增加 --restart=always 参数即可 2.使用 docker-compose 命令运行时 在 yml 文件中,需要自启动的 service 下 ...
- 单片机+4G模块和主流物联网平台实现MQTT协议通信视频教程
单片机+4G模块和主流物联网平台实现MQTT协议通信视频教程 1.单片机+4G模块和阿里云物联网平台实现MQTT协议通信视频教程单片机+4G模块和阿里云物联网平台实现MQTT协议通信,阿里云物联网平台 ...
- linux 笔记 (2)
1:管道:用竖杠表示(|),语法结构:命令1|命令2(把信息从一端传送到另一端) 2:tee:把输出的一个副本输送到标准输出,一般配合管道(|)一起使用 例如:who | tee who.out 3: ...
- 【InnoDB优化的两大法器】内存池与后台线程解析
InnoDB 存储引擎的体系架构是其高性能.事务安全性和崩溃恢复能力的核心,主要围绕内存池(In-Memory Structures) 和后台线程(Background Threads) 两大组件进行 ...
- 一步一步学习使用LiveBindings(7) 实现对JSON数据的绑定
一步一步学习使用LiveBindings(7) 实现对JSON数据的绑定 本课将介绍如何从JSON中获取绑定数据源,并且将更新也写回JSON.可以设想一下有一台远端服务器提供JSON数据,Delphi ...
- Openstack 创建实例提示Failed to allocate the network(s)
环境是 Windows 11 → VMware Workstation→ Ubuntu → VirtualBox → OpenStack Web界面 创建实例时 报错 Error: Failed to ...
- 超简单!手把手教你玩转ClaudeCode,无魔法不会员!
如果我说 Claude Code 是目前世界上最强的 AI 生成工具,大家应该都没意见吧? 不是因为 Claude Code 牛逼,而是因为它底层使用了 Claude 4 Sonnet 满血模型,这是 ...
- SBERT现在在业界中是什么地位,是否常用?有没有比SBERT更好的同类技术?
作者:transformer链接:https://www.zhihu.com/question/507525712/answer/2280236067来源:知乎著作权归作者所有.商业转载请联系作者获得 ...
- 技术分享 | MySQL TEXT 字段的限制
一.背景说明项目中有一个数据交换的场景,由于使用了很多个 varchar(1000).varchar(2000),导致在创建表的时候,MySQL 提示: ERROR 1118 (42000): Row ...