浮动菜单的实现
功能展示 •在许多应用软件中,菜单都具有浮动功能,例如在WORD中,用户可以将菜单手动到任意位置,当前实例我们实现这一功能,效果如右图
4.上位机VC MFC浮动菜单的实现
•在文档/视窗结构的应用程序中,默认情况下,工具栏具有拖动菜单的功能,如果在用户单击工具栏按钮时,能够弹出一个快捷菜单,就可以实现一个浮动的菜单了,如何确定用户是否单击了工具栏按钮?可以通过mainframe类中添加 TBN_DROPDOWN,通知消息映射宏为实现,ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnToolbarDropDown),这样,当用户单击工具栏按钮时,就会调用 自定义的OnToolbarDropDown(),,在该方法中可以获得用户单击的工具栏按钮ID的按钮的客户区域,根据ID加载相应的菜单项实现功能
功能实现 •1.新建一个单文档应用程序 •2.调用例程中CFloatMenu类 •的FloatMenu.CPP和FloatMenu.h •其中AddButtonFromMenu()根据系统菜单添加工具栏按钮 •BOOLCFloatMenu::AddButtonFromMenu(UINT IDresource) •{
• CMenu Menu ; • if (Menu.LoadMenu(IDresource)) • { • //获取菜单顶层菜单数 • UINT ButtonCount = Menu.GetMenuItemCount(); • UINT * array = new UINT[ButtonCount]; • CString text; • for (UINT n = 0; n<ButtonCount;n++) • { • array[n]=ID_BUTTON1 +n; • } • SetButtons(array,ButtonCount); • for (UINT i=0;i<ButtonCount;i++) • { • Menu.GetMenuString(i,text,MF_BYPOSITION); • SetButtonText(i,text); • SetButtonStyle(i,TBSTYLE_DROPDOWN); • } • delete array; • Menu.DestroyMenu(); • return true; • } • else • return FALSE; •} •GetIndexFromPoint()根据光标,确定工具栏按钮索引 UINT CFloatMenu::GetIndexFromPoint(CPoint pot) for (int i =0;i< GetToolBarCtrl().GetButtonCount()-1;i++) •最后在框架类中添加消息映射 •ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnToolbarDropDown) •ON_COMMAND_RANGE(ID_BUTTON1,ID_BUTTON1+5,OnMenuTreat) •并实现OnToolbarDropDown() OnMenuTreat()两函数
•具体如何操作,我们打开编程软件,简单讲解源码的阅读和功能的实现
源码及视频教程下载(仅电脑上可见):
|