动态添加菜单项、子菜单、右键菜单 VC
- 格式:doc
- 大小:31.63 KB
- 文档页数:6
方正飞翔8.2数字版FounderFXDP 8.2 使用说明书北京北大方正电子有限公司2022年2月本手册内容改动及版本更新将不再另行通知。
本手册适用于方正飞翔8使用。
本手册的范例中使用的人名、公司名和数据如果没有特别指明,均属虚构。
对于本手册、及本手册涉及的技术和产品,北京北大方正电子有限公司拥有其专利、商标、著作权或其他知识产权,除非得到北京北大方正电子有限公司的书面许可,本手册不授予这些专利、商标、著作权或其他知识产权的许可。
版权所有©(2002~2022)北京北大方正电子有限公司保留所有权利●Founder是北京北大方正集团公司的注册商标,方正飞翔(FounderFX)是北京北大方正电子有限公司的商标。
●Microsoft、MS-DOS、Windows、Windows NT是Microsoft公司的商标或注册商标。
●其他标牌和产品名称是其各自公司的商标或注册商标。
●方正飞翔的一切有关权利属于北京北大方正电子有限公司所有。
●本手册中所涉及的软件产品及其后续升级产品均由北京北大方正电子有限公司制作并负责全权销售。
北京北大方正电子有限公司地址:北京海淀区上地信息产业基地五街九号方正大厦电话:(010)82531188传真:(010)62981438邮编:100085方正客户服务中心(010)82531688提供方正飞翔的售后技术支持和服务质量监督电话:(010)62981478质量监督信箱:****************网址:/目录目录第1章概述 (1)方正飞翔数字版(以下简称飞翔数字版)的作用 (1)应用领域 (1)数字出版物的制作流程 (1)系统配置 (2)安装 (3)飞翔的安装和卸载 (3)加密锁 (3)连接服务器(飞翔网络服务版) (3)工作区浏览 (3)选项卡 (4)页面视图 (4)工具箱 (6)浮动面板 (7)快速访问工具栏和工具条 (7)状态栏和滚动条 (7)Tip提示 (8)标尺 (8)提示线 (8)界面显示方式 (8)表达习惯 (9)第2章排版入门 (10)新建文档 (10)排入文档 (11)静态内容排版 (11)应用文字样式 (11)应用段落样式 (12)1方正飞翔8.2数字版使用说明书2 制作互动效果 (13)预览 (14)文档输出 (15)输出 (15)打包 (15)第3章工作环境设置 (16)文件设置 (16)常规 (16)默认图元设置 (17)默认排版设置 (17)偏好设置 (18)常规 (19)文本 (20)单位和步长 (22)图像 (22)字体搭配 (24)字体设置 (24)常用字体 (24)文件夹设置 (24)拼写检查 (24)自定义快捷键 (25)插件管理 (26)字体集管理 (26)复合字体 (27)禁排设置 (28)导入/导出工作环境 (29)第4章文件操作 (30)文件的基本操作 (30)版面设置 (30)版面调整 (30)打开文件 (31)目录多文件操作 (31)合并文件 (31)输出向导 (33)预飞 (33)文档输出 (35)保存并同步至云端 (36)工程输出 (40)另存PDML/XML格式文件 (42)打包 (43)模板文件 (43)基于模板新建文件 (43)新建模板 (43)文件打印 (45)打印 (45)第5章录入文字和排入图片 (47)录入文字内容 (47)文字块内录入文字 (47)排入图片 (47)JPG格式 (47)PDF格式 (49)排入PDF (50)排入CorelDraw文件 (50)支持的CorelDraw文件特性 (50)排入CorelDraw文件 (50)部件库 (50)新建部件 (52)复制部件 (52)素材夹 (52)增加、删除素材目录 (53)搜索 (53)第6章文字处理 (54)3方正飞翔8.2数字版使用说明书4 文字的字符处理 (54)文字的录入 (54)符号的录入 (55)文字编辑操作 (56)选中文字 (56)文字的查找替换 (56)正则表达式 (58)文字的内码转换 (61)文字的属性操作 (61)格式刷 (61)文字的美工设计 (62)艺术字 (62)装饰字 (62)文裁底 (63)转裁剪路径 (63)文字转曲 (63)文字的字体操作 (64)字体管理 (64)文字样式 (64)创建样式 (64)编辑样式 (65)应用样式 (65)断开与样式的链接 (65)应用样式,清除无名属性 (66)导入/导出样式 (66)第7章段落排版 (67)段落的基本操作 (67)段落样式 (67)创建样式 (67)编辑样式 (73)应用样式 (73)目录导入/导出样式 (74)第8章文字版面排版 (75)文字块基本操作 (75)文字块标记 (75)删除文字块 (76)文字块形状 (76)框适应文 (77)文字块内空 (77)文字打散 (78)文字排版格式 (78)文字排版方向 (78)英文排版功能 (78)中文与英文数字间距 (78)使用弯引号 (78)拆音节 (79)优化字偶距 (79)拼注音排版 (80)拆笔画 (83)跟随式 (84)笔画式 (85)描红式 (85)笔画跟随式 (85)第9章版面对象操作 (87)对象基本操作 (87)选中对象 (87)移动对象 (87)编辑对象 (88)对象的大小 (88)对象的倾斜、旋转和变倍 (88)对齐 (89)镜像 (90)5方正飞翔8.2数字版使用说明书6 对象的捕捉操作 (90)设置捕捉距离 (91)捕捉对象类型 (91)智能参考线与捕捉 (91)对象层管理及层次关系 (91)层管理的基本操作 (92)同一层上的对象层次 (92)对象管理 (92)对象的成组与锁定 (92)成组和解组 (92)锁定和解锁 (93)对象的图文混排 (93)沿线排版 (93)条码对象操作 (94)对象的设计操作 (94)阴影与透明 (94)图像填充 (95)第10章互动效果制作 (96)互动对象 (96)音频 (96)背景音乐 (98)视频 (100)图像扫视 (101)图片对比 (103)图像序列 (104)滑线动画 (105)自由拖拽 (107)图文框 (107)网页视图 (107)动感图像 (108)图表 (109)目录地理标注 (110)增强现实 (111)精灵 (112)拼图游戏 (112)演示文稿 (114)擦除 (114)点播 (115)复读 (117)画廊 (118)按钮 (120)弹出内容 (126)逻辑事件 (129)合成图片 (133)虚拟现实 (134)转滚动内容 (136)超链接 (137)加载页 (139)数据服务 (139)文本 (139)单选 (141)复选 (142)照片 (144)列表 (145)微信头像 (146)微信昵称 (147)接力计数 (147)计时器 (149)测验 (150)数据按钮 (150)动画 (152)普通动画的制作方式 (152)7方正飞翔8.2数字版使用说明书8路径动画的制作方式 (154)形变动画的制作方式 (155)背景 (157)页面属性 (157)对象转换 (159)转普通对象 (159)转图像块 (160)对象管理 (160)互动效果预览 (161)互动对象管理 (161)制作导览目录 (162)创建导览目录 (163)编辑导览目录 (164)标注栏目 (166)目录的合并 (166)栏目分类 (166)第11章图像处理 (168)图像基本操作 (168)调整图像大小 (168)图像显示操作 (168)图框适应 (169)图像裁剪操作 (169)用选取工具裁剪图像 (169)用图像裁剪工具裁剪图像 (169)使用穿透工具裁剪图像 (169)用剪刀工具切分图像 (169)图像裁剪 (170)图像管理 (170)灰度图着色 (174)启动图像编辑器 (174)第12章图形操作 (176)目录图形基本操作 (176)绘制图形 (176)图形编辑 (178)图形属性基本设置 (180)图形变换操作 (183)块变形操作 (183)隐边矩形操作 (183)路径运算操作 (184)第13章颜色 (185)颜色的基本操作 (185)颜色面板 (185)颜色模式 (185)存为色样 (186)为对象着色 (186)颜色工具 (186)颜色吸管 (186)颜色样式 (187)色样浮动窗口 (187)应用色样 (188)色样的基本操作 (188)第14章配套设计资源 (189)平面设计 (189)图形素材 (189)教辅素材 (189)图像编辑 (189)云部件 (189)字+ (189)第15章辅助工具说明 (190)素材加工工具 (190)阅读器 (190)数字出版物上传工具 (191)9方正飞翔8.2数字版使用说明书附录:快捷键汇总 (192)工具箱 (192)主功能区 (193)工具切换 (196)文字操作 (197)版面操作 (199)对象操作 (200)输入法 (202)使用条款 (203)10第1章概述第1章概述方正飞翔数字版(以下简称飞翔数字版)的作用在印刷出版时代,出版物以纸张做为载体,纸张上可以印刷文字、图片、图形等静态内容。
menustrip控件用法什么是menustrip控件menustrip控件是一个用于创建菜单栏的工具。
菜单栏是指在应用程序窗口的顶部显示的水平导航栏,通常用于显示应用程序的各种功能和选项。
menustrip控件可以包含多个菜单项,每个菜单项都可以包含子菜单项或者是与之关联的操作。
通过点击菜单项,用户可以选择执行相应的操作或打开子菜单。
menustrip控件通常用于创建简洁明了的用户界面,使用户可以方便地访问和操作应用程序的功能。
menustrip控件的基本用法下面介绍menustrip控件的基本用法。
添加menustrip控件在Windows窗体应用程序中,要使用menustrip控件,首先需要将它添加到窗体中。
1.打开Visual Studio,创建一个新的Windows窗体应用程序项目。
2.在窗体设计器中,找到工具箱中的”MenuStrip”控件,并将其拖放到窗体上。
添加菜单项menustrip控件中可以添加多个菜单项,每个菜单项可以包含子菜单项或执行操作。
1.在menustrip控件上,右键单击并选择”Add Menu Item”。
2.输入菜单项的文本,例如”File”,然后按下回车键。
3.再次右键单击menustrip控件,并选择”Add Menu Item”。
4.输入另一个菜单项的文本,例如”Edit”,然后按下回车键。
添加子菜单项对于每个菜单项,我们可以添加子菜单项以创建多层菜单结构。
1.选中一个菜单项,例如”File”。
2.右键单击该菜单项,并选择”Add Menu Item”。
3.输入该子菜单项的文本,例如”New”,然后按下回车键。
关联操作菜单项可以关联一个操作,当用户选择该菜单项时,执行相应的操作。
操作可以是打开一个窗体、执行一个方法等。
1.选中一个菜单项,例如”New”。
2.在属性窗口中,找到”Click”事件,并双击该事件。
3.在事件处理程序中,编写执行的操作代码。
以下是一个示例代码:private void newToolStripMenuItem_Click(object sender, EventArgs e){// 打开一个新窗体或执行其他操作}menustrip控件的高级用法除了基本的菜单创建和操作关联,menustrip控件还支持许多高级用法。
wpf多级动态右键菜单ContextmMenu 原创 2016年09月21日 17:54:38•标签:•wpf /•右键菜单 /•子菜单 /•动态添加子菜单•[csharp] view plain copyprint?1.搞这个右键菜单用了挺长的时间,一是网络上面资料比较少,二是里面有坑,坑就是众所周知,c#程序有两种窗口,一种是Form窗口,另一种是wpf窗口。
网上的资料是这两种混合,开始我并没有意识到这两种有多大的差别,但是看了许多资料发现有很多自相矛盾的地方,因为这两种窗口有很多不同的地方:•Form:contextmenustrip已经替代了contextmenu,但是contextmenu仍然可以用。
•Wpf:只能使用contextmenucontextmenu和contextmenudtrip有以下几种区别:【1】可以将ContextMenuStrip 与任何控件关联,单击鼠标右键会自动显示快捷菜单。
【2】可以通过使用Show 方法以编程方式显示ContextMenuStrip。
【3】ContextMenuStrip支持可取消的 Opening 和 Closing 事件以处理动态填充和多次单击方案。
【4】ContextMenuStrip支持图像、菜单项复选状态、文本、访问键、快捷键和级联菜单。
尽管ContextMenuStrip 对以前版本的ContextMenu 控件的功能进行了替换和添加,但考虑到向后兼容性和将来的使用(如果的确需要),仍然保留了 ContextMenu。
建议采用ContextMenuStripForm我没有研究,写一下wpf右键菜单实现方式。
一强行使用contextmenustrip虽然wpf不能加contextmenustrip控件,但是可以在右键单击响应里使用show显示出来。
好处是比较方便,可以随意控制子菜单项,而且contextmenustrip可以随意加图片等其他部分。
VCAPI之菜单函数1.CreateMenu(VOID)函数功能:该函数创建一个菜单。
此菜单最初是空的,但可用函数InserMenultem,AppendMenu,和lnsertMenu来填入菜单项。
函数原型:HMENU CreateMenu(VOID)参数:无。
返回值:如果函数调用成功,返回值是新创建菜单的句柄。
如果函数调用失败,返回值是NULL。
若想获得更多的错误信息,请调用GetLastError函数。
备注:与被分配给一个窗日的菜单相联系的资源会被自动释放。
如果此菜单未被分配给一个窗口,应用程序必须在关闭之前释放与菜单相连的资源。
应用程序通过调用函数DestroyMenu来释放菜单资源。
2.HMENU CreatePopupMenu(VOID)函数功能:该函数创建一个下拉式菜单、子菜单或快捷菜单。
此菜单最初是空的,但可用函数InsertMenultem来插入或追加菜单项。
也可用函数InsertMenu来插人菜单项,用AppendMenu来追加菜单项。
函数原型:HMENU CreatePopupMenu(VOID)参数:无。
返回值:如果函数调用成功,返回值是新创建菜单的句柄。
如果函数调用失败,返回值是NULL。
若想获得更多的错误信息,请调用GetLastError函数。
备注:一个应用程序可增加新菜单到已存在的菜单上,或者可以调用函数TrackPopupMenuEx或TrackPopupMenu来显示快捷菜单。
与被分配给一个窗口的菜单相联系的资源会被自动释放。
如果此菜单未被分配给一个窗口,应用程序必须在关闭之前释放与菜单相连的资源。
应用程序通过调用函数DestroyMenu来释放菜单资源。
Windows95环境下,系统可支持最多16,364个菜单句柄。
3.BOOL AppendMenu(hMenu hMenu,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem)函数功能:该函数在指定的菜单条、下拉式菜单、子菜单或快捷菜单的末尾追加一个新菜单项。
MFC 单文档中动态添加菜单项和响应菜单事件新建一个单文档程序在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏#define ID_NEWMENU WM_USER+101操作工具栏和状态栏使用GetDescendantWindow函数获取工具栏和状态栏的指针为ID_HIDE添加消息映射,编辑代码如下static bool m_Hide=false;m_Hide=!m_Hide;//获取工具栏指针CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);//获取状态栏指针CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);CMenu* pMenu=GetMenu();CMenu* pSubMenu=pMenu->GetSubMenu(2);if(m_Hide){pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"显示工具栏");if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("隐藏工具栏");if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_HIDE);}else{pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"隐藏工具栏");if(pWndStatusBar!=NULL) pWndStatusBar->SetWindowText("显示工具栏");if(pWndToolBar!=NULL) pWndToolBar->ShowWindow(SW_SHOW);}动态添加子菜单为ID_NEWMENU增加消息映射,编辑代码如下static UINT m_NewMenu=ID_NEWMENU+1;//获取菜单CMenu* pMenu=GetMenu();//获取索引为2的菜单项,即第3列菜单CMenu* pSubMenu=pMenu->GetSubMenu(2);char buffer[1];itoa(m_NewMenu-ID_NEWMENU,buffer,10);if(m_NewMenu<=ID_NEWMENU+5){pSubMenu->AppendMenu(MF_SEPARATOR); //分隔线pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,CString("新的菜单")+buffer);}//如果m_bAutoMenuEnable为true,则会依次检查View、Document、Frame的//消息映射表是否有这个弹出菜单中每个菜单项的处理函数,澳门新濠天地官网 如果没有就会把那一项改为灰的m_bAutoMenuEnable=false;添加OnCommand的消息映射用来响应添加的子菜单项,代码如下UINT uMsg=LOWORD(wParam);for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++)if(uMsg==i){char buffer[1];itoa(i-ID_NEWMENU,buffer,10);MessageBox(CString("新的菜单") + buffer);}右键菜单在View类中添加OnRButtonDown的消息映射,代码如下CMenu pPopMenu;pPopMenu.CreatePopupMenu();if(pPopMenu==NULL);pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"右键菜单");this->ClientToScreen(&point);pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);在View类中添加OnCommand的消息映射用来响应右键菜单的事件UINT uMsg=LOWORD(wParam);if(uMsg==ID_NEWMENU+6)MessageBox(CString("右键菜单"));。
C#-----Winform界⾯实现右键菜单功能1.新建Form窗体,向其中添加ContextMenuStrip控件2.点击ContextMenuStrip控件属性Items,添加MenuItem或Separator组件3.点击⼀级菜单,添加MenuItem或Separator组件,形成⼆级菜单4.Demo代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Contextmenu{public partial class frmContextmenu : Form{public frmContextmenu(){InitializeComponent();}private void tSMICenter_Click(object sender, EventArgs e){int height =SystemInformation.WorkingArea.Height;int width = SystemInformation.WorkingArea.Width;int formheight = this.Size.Height;int formwidth = this.Size.Width;int newformx = width / 2 - formwidth / 2;int newformy = height / 2 - formheight / 2;this.SetDesktopLocation(newformx, newformy);}private void tSMILargen_Click(object sender, EventArgs e){this.Width =this.Width+100;this.Height = this.Height + 100;}private void tSMISmaller_Click(object sender, EventArgs e){this.Width = this.Width - 100;this.Height = this.Height- 100;}private void frmContextmenu_MouseClick(object sender, MouseEventArgs e){if (e.Button==MouseButtons.Right){contextMenuStrip.Show(MousePosition.X,MousePosition.Y);}}}}namespace Contextmenu{partial class frmContextmenu{///<summary>///必需的设计器变量。
VBA实现自定义菜单与工具栏的步骤与技巧自定义菜单和工具栏是VBA中非常有用的功能,能够提供更加灵活和高效的用户界面。
通过自定义菜单和工具栏,我们可以根据自己的需求添加或删除菜单项和工具按钮,使得用户能够方便地访问所需的功能。
本文将介绍如何使用VBA实现自定义菜单与工具栏的步骤与技巧。
一、创建自定义菜单要创建自定义菜单,首先需要打开Visual Basic编辑器(VBE),然后按下ALT+F11快捷键。
在VBE中,选择“插入” -> “用户窗体”或者右键单击项目资源管理器中的该工作簿并选择“插入模块”。
在新的用户窗体或模块中,输入以下代码,以创建一个名为"CustomMenu"的自定义菜单。
```vbaSub CreateCustomMenu()Dim cBar As CommandBarDim cBarControl As CommandBarControl' 如果已经存在名称为"CustomMenu"的菜单,则删除它On Error Resume NextmandBars("CustomMenu").DeleteOn Error GoTo 0' 创建自定义菜单Set cBar = mandBars.Add(Name:="CustomMenu", Position:=msoBarPopup, _MenuBar:=False, Temporary:=True)' 添加菜单项Set cBarControl = cBar.Controls.Add(Type:=msoControlButton)With cBarControl.Caption = "菜单项1".OnAction = "Macro1"End WithSet cBarControl = cBar.Controls.Add(Type:=msoControlButton)With cBarControl.BeginGroup = True.Caption = "菜单项2".OnAction = "Macro2"End WithEnd SubSub Macro1()' 菜单项1的宏代码End SubSub Macro2()' 菜单项2的宏代码End Sub```在创建的自定义菜单中,我们通过`CommandBar`对象和`CommandBarControl`对象来创建和添加菜单项。
[转]objectarx加载菜单-ObjectARX中右键(快捷)菜单的实现⽅法 右键菜单,也叫快捷菜单,在Windows编程中叫上下⽂(context)菜单。
ObjectARX本⾝提供了⼀套处理上下⽂菜单的机制。
在ObjectARX类库中有⼀个名为AcEdUIContext的类,此类负责在ObjectARX应⽤中的上下⽂菜单中添加⾃⼰的菜单项,⽽原菜单项不会被破坏,这也是此种⽅法的优点之⼀。
⽤AcEdUIContext类添加菜单时,菜单项的数⽬没有限制,但必须是⽂本菜单。
菜单可以层叠,但不允许使⽤键盘加速键,不能够在状态⾏显⽰快捷菜单命令状态提⽰。
此类可以处理三种情况下的上下⽂菜单:⼀个默认上下⽂菜单,⼆是实体对象上下⽂菜单,三是命令执⾏时上下⽂菜单。
虽然菜单出现的时机不同,但⽅法基本相同,它们之间主要的不同是所⽤的加载和卸载函数不同。
下⾯加以详细介绍。
在AcEdUIContext为中包含了三个重要的成员函数,他们分别是:(1) AutoCAD系统获取快捷菜单句柄函数virtual void * getMenuContext(const AcRxClass * unnamed,const AcDbObjectIdArray& unnamed) = 0;其中,第⼀个参数unnamed 是当前所选择的实体的对象句柄,第⼆个参数unnamed是所选实体的实体ID数组。
这两个参数只有在实体对象上下⽂菜单中有效。
(2) 菜单项命令事件响应函数virtual void onCommand(Adesk::UInt32 unnamed) = 0;其中,unnamed是相应菜单项的菜单ID。
此函数在⽤户选择执⾏快捷菜单中的某个菜单项时被调⽤。
(3) 菜单更新函数virtual void OnUpdateMenu();AutoCAD在快捷菜单弹出之前调⽤此函数。
相当于MFC中的菜单更新事件,我们可以在这个函数中改变菜单项的检查状态或使能菜单项等。
使用VC2005一些问题及解决方案(一)首先是我使用VC2005在不通阶段的不通感受:刚开始安装VS2005时候感觉:真是大啊!装了我一个上午!!而且运行个VC有时能耗我好大的内存。
刚使用VC2005时候的感受:界面挺不错,貌似功能更强大,对C++标准支持的很好,还可以用我最喜欢的Comic Sans MS字体,还支持代码收缩等等。
虽然比较慢,但是不像VC6. 0那样老是出现编译死机的情况。
开始用VC2005学习写东西的时候的感受:实在没有6.0好用,限制太多,很多地方跟VC6. 0不一样,而且很多功能似乎都找不到了。
还不如6.0方便。
使用一段时间的感受:虽然经常遇到问题但是都是有很好的解决方案的,而且相对6.0,2005的BUG少很多,总体来说如果机器配置还算可以的话,用2005是挺不错的。
下面就是我使用VC2005遇到的以及解决了的问题:VC遇到的以及解决了的问题1,对于Radio控件如何正确设置属性Group?首先要确保几个Radio控件的Tab是按顺序的(可以在对话框编辑器中按Ctrl+D将三个控件T ABORDER设置在一起)。
然后对第一个Radio控件选择Group属性,其他的不用选。
对第一个控件添加关联变量int m_test,并且设置初值-1,则当我们点击第一个控件m_test值是0,点击第二个m_test值是1....依此类推。
2,VC2005中添加虚函数问题:在VC6.0中可以对类右键添加虚函数,在VC2005中需要在类属性中点击一个重写按钮,在那里添加虚函数。
3,VC2005动态添加右键菜单问题:在VC6.0中我们可以在Project->Add To Project->Component and Control中添加组件,如添加Pop-up Menu可以实现添加右键快捷菜单的功能。
但是在VC2005中我们没有这个功能,但是我们可以手动自己添加,也不是很复杂。
步骤如下(假设工程是一般MFC视图工程命名Menu):1,自己添加一个Menu资源,例如命名为IDR_MENU1,编辑之。
VC++任务栏托盘图标及右键菜单实现作者:xingzhe826 日期:2013年11月14日1.创建单文档工程TaskQMenu2.设置图标右键菜单,ID为IDR_TPMENU3.初始化托盘图标// 初始化托盘图标NOTIFYICONDATA nifd; // NOTIFYICONDATA 结构声明nifd.cbSize = sizeof(NOTIFYICONDATA); // NOTIFYICONDATA 结构体大小nifd.hWnd = m_hWnd; // 标识窗口:接收与托盘图标相关的消息 nifd.uID = IDR_MAINFRAME; // 指定任务栏图标nifd.uFlags = NIF_MESSAGE // 指定该结构体变量的那些成员变量有效| NIF_ICON| NIF_TIP;nifd.uCallbackMessage = WM_UIMSG; // 自定义消息标识:当托盘图标发生鼠标事// 件或使用键盘选择或激活图标时,系统将// 次标识向hWnd窗口发送消息 nifd.hIcon = theApp.LoadIcon(IDR_MAINFRAME);// 图标句柄lstrcpy(nifd.szTip, _T("提示文本")); // 托盘图标提示文本Shell_NotifyIcon(NIM_ADD, &tnd); // 安装托盘图标4.消息处理BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_MESSAGE(WM_UIICON, OnNotifyIcon) // WM_UIICON消息映射END_MESSAGE_MAP()afx_msg LRESULT OnNotifyIcon(WPARAM wParam, LPARAM lParam);// 消息处理LRESULT CMainFrame::OnNotifyIcon(WPARAM wParam, LPARAM lParam){UINT uID; // 发出该消息的消息的图标IDUINT uMouseMsg; // 鼠标消息uID = (UINT)wParam; // 参数解析并赋值uMouseMsg = (UINT)lParam;if(WM_LBUTTONDOWN == uMouseMsg){// 单击左键if (IDR_MAINFRAME == uID){if (IsIconic()) // 是否最小化(图标化)窗口{ShowWindow(SW_NORMAL);}}}else if (WM_RBUTTONDOWN == uMouseMsg){// 单击右键if (IDR_MAINFRAME == uID){CMenu menu;menu.LoadMenu(IDR_TPMENU); // 加入图标右键快捷菜单SetForegroundWindow(); // 放置在前面CMenu* pMenu = menu.GetSubMenu(0); // 下拉菜单ASSERT(NULL != pMenu);POINT pt;GetCursorPos(&pt);pMenu->TrackPopupMenu( // 弹出快捷菜单TPM_RIGHTBUTTON | TPM_LEFTALIGN, pt.x, pt.y, this);pMenu->DestroyMenu();}}return TRUE;}5.在程序退出消息处理程序中执行托盘图标卸载过程// 添加消息映射BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_COMMAND(ID_APP_EXIT, OnAppExit)END_MESSAGE_MAP()// 消息处理函数afx_msg void OnAppExit();void ExitNotifyIcon();void CMainFrame::OnAppExit(){ExitNotifyIcon();}void CMainFrame::ExitNotifyIcon(){NOTIFYICONDATA nifd;nifd.cbSize = sizeof(NOTIFYICONDATA);nifd.hWnd = m_hWnd;nifd.uID = IDR_MAINFRAME;Shell_NotifyIcon(NIM_DELETE, &nifd);AfxPostQuitMessage(0);}小结:1)学习理解NOTIFYICONDATA结构体中的成员变量2)Shell_NotifyIcon()的使用:安装/卸载3)IsIconic()的使用4)自定义消息映射/ID_APP_EXIT系统ID的应用PS:衣缘满室此链接与学习无关,纯粹GG。
动态添加菜单项、子菜单、右键菜单
VC
动态添加菜单项、子菜单、右键菜单(VC)2010-06-27 16:56如何动态添加菜单/菜单项、子菜单、右键菜单
有关菜单的操作主要用到CMenu类,当然也可用相应API函数,CMenu类只是MFC对API中操作菜单的函数的封装而已。
不过能用类就尽量用类,类的组织方式好呗,代码看着也舒服。
若是SDK编程,那就用API吧。
CMenu menuMain,menu1;//首先定义CMenu对象
一、创建菜单,有两种方法
1.用LoadMenu函数从资源加载
menuMain.LoadMenu(IDR_MAINFRAME);//从资源加载,这里使用SDI的主菜单资源
2.用CreateMenu函数创建
menu1.CreateMenu();//创建菜单,还没有菜单项
二、添加菜单项,可用AppendMenu()在菜单的最后加、InsertMenu()在指定的位置加.
//ID_TEST1在Resource.h中定义,随便给个整数值,不要和已有的重复就行了
menu1.AppendMenu(MF_STRING,ID_TEST1,"Test1");//第一项菜单项
menu1.AppendMenu(MF_STRING,ID_TEST2,"Test2");//第二项菜单项
menu1.InsertMenu(1,MF_BYPOSITION|MF_STRING,
(UINT)ID_TEST1,"ID_TEST1");//在第二项菜单项前添加新菜单项
三、添加子菜单
同样用AppendMenu()、InsertMenu()函数。
不过要注意参数的设置。
menu1.AppendMenu(MF_BYPOSITION|MF_POPUP|MF_STRING,
(UINT)menuMain.GetSubMenu(0)-m_hMenu,"子菜单");
//第二个参数是菜单的句柄HMENU
四、删除菜单
用DeleteMenu()、RemoveMenu()函数来删除指定位置的菜单/菜单项。
两者区别:如果菜单项是一个弹出式菜单,那么DeleteMenu和RemoveMenu之间的区别就很重要。
DeleteMenu清除弹出式菜单,但RemoveMenu不清除它。
一个是彻底的删除,一个只是移除.
MSDN:1.The DeleteMenu function destroys the handle to the menu or submenu and frees the memory used by the menu or submenu.它使菜单或者子菜单的handle无效(destroys)。
2.RemoveMenu does not destroy the menu or its handle,allowing the menu to be reused.可以再利用,并不从内存中将menu删除。
五、添加右键菜单
CMenu menu1;
menu1.CreatePopupMenu();//动态创建弹出式菜单对象
menu1.AppendMenu(MF_STRING,ID_TEST1,"菜单项1");
menu1.AppendMenu(MF_STRING,ID_TEST2,"菜单项2");
menu1.InsertMenu(2,MF_BYPOSITION|MF_POPUP|MF_STRING,
(UINT)menuMain.m_hMenu,"子菜单");//添加子菜单
CPoint pt;
GetCursorPos(&pt);
menu1.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);
menu1.DestroyMenu();
六、响应菜单的事件
1.若是资源中添加的菜单可用Class Wizard添加菜单的响应事件。
2.若是通过代码创建的菜单,要手工实现菜单的消息映射。
本例是在CmainFrame类中,当然也可在View类、Doc类中,基于对话框的同样也可以。
1)在.h文件中
//Generated message map functions protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnChangmenuitem();//这里添加菜单命令处理函数的声明
//}}AFX_MSG DECLARE_MESSAGE_MAP()
2)在.cpp文件中,
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(IDM_CHANGMENUITEM,OnChangmenuitem)//这里添加,注意没有';'
//}}AFX_MSG_MAP END_MESSAGE_MAP()
void CMainFrame:OnChangmenuitem()
{
//这里写你要如何处理的代码
…
}
其他方法:
若菜单ID值是连续的,最好用ON_COMMAND_RANGE来映射消息处理函数,
可以在一个函数中处理一个范围内的所有消息。
当用户按下某个菜单项,会发出一个WM_COMMAND消息,而菜单项的ID号,就包含在参数wParam的低位中.BOOL CYourView:OnCommand(WPARAM wParam,LPARAM lParam)
{
//TODO:Add your specialized code here and/or call the base class UINT m_nItemID=LOWORD(wParam);
if(m_nItemID==ID_YOURITEM)//ID_YOURITEM为你加入菜单项时指定的ID号
{//在这里放入响应的代码}return CScrollView:
OnCommand(wParam,lParam);}
对于右键菜单可以通过TrackPopupMenu的返回值来处理。
在参数uFlags
中设置TPM_ RETURNCMD,这样返回值就是你选择的菜单项的ID,然后可以根据ID来处理。
TrackPopupMenu(TPM_ RETURNCMD,pt.x,pt.y,this);
MSDNIf you specify TPM_RETURNCMD in the uFlags parameter,the return value is the menu-item identifier of the item that the user selected.
七、其他
DrawMenuBar();//当您改变菜单时,需要重画菜单才能显示所做的改变
GetSystemMenu();//取得窗口控制窗口
GetMenu()//取得当前程序使用的菜单
GetSubMenu()//取得子菜单
应使用CMenu类的Detach()成员函数从Cmenu对象中分离出菜单句柄,避免对象失效后程序出错。
如:
CMenu menu;
menu.CreatePopupMenu();//动态创建弹出式菜单对象
menu.AppendMenu(0,ID_TEST1,"Test1");
menu.AppendMenu(0,ID_TEST2,"Test2");
CMenu*menuMain=GetMenu();//取得程序主菜单需在CMainFrame类中
menuMain-
AppendMenu(MF_BYPOSITION|MF_POPUP|MF_STRING,(UINT)menu.m_hMenu,"子菜单1");
menu.Detach();//直接用menu.m_hMenu在运行时出错,menu对象在这个事件结束就销毁了
DrawMenuBar();。