工控编程吧
标题:
4.上位机VC MFC浮动菜单的实现
[打印本页]
作者:
qq263946146
时间:
2015-11-7 21:21
标题:
4.上位机VC MFC浮动菜单的实现
浮动菜单的实现
功能展示
•在许多应用软件中,菜单都具有浮动功能,例如在WORD中,用户可以将菜单手动到任意位置,当前实例我们实现这一功能,效果如右图
(, 下载次数: 0)
上传
点击文件名下载附件
要点提示
•在文档/视窗结构的应用程序中,默认情况下,工具栏具有拖动菜单的功能,如果在用户单击工具栏按钮时,能够弹出一个快捷菜单,就可以实现一个浮动的菜单了,如何确定用户是否单击了工具栏按钮?可以通过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)
{
CRect rect;
for (int i =0;i< GetToolBarCtrl().GetButtonCount()-1;i++)
{
GetItemRect(i,rect);
if(rect.PtInRect(pot))
return i;
}
return -1;
}
•最后在框架类中添加消息映射
•ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnToolbarDropDown)
•ON_COMMAND_RANGE(ID_BUTTON1,ID_BUTTON1+5,OnMenuTreat)
•并实现OnToolbarDropDown() OnMenuTreat()两函数
•具体如何操作,我们打开编程软件,简单讲解源码的阅读和功能的实现
[iqiyi]http://player.video.qiyi.com/9e0ff31ec47cab0c3abfd895c25d98c0/0/0/w_19rt8kpvy5.swf-albumId=4833662609-tvId=4833662609-isPurchase=0-cnId=12[/iqiyi]
源码及视频教程下载
(仅电脑上可见)
:
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4