首页 VC界面类编程Toolbar制作菜单条过程详解

VC界面类编程Toolbar制作菜单条过程详解

举报
开通vip

VC界面类编程Toolbar制作菜单条过程详解Toolbar制作菜单条过程详解 现在许多用户界面都使用工具栏制作菜单条,小弟最近对此感兴趣,便从网上求助,可是得到的帮助大多是BCGControlBar的源代码或者是SizableRebar的源代码,对于只希望是自己的界面具有该功能的朋友来说,这也许是不错的选择,只要看一下demo,然后直接调用别人的类库就可以了,但对于我等对此话题感兴趣,希望弄懂其来龙去脉的读者来说,直接看这些没有详细解释的源代码,要从中弄出个所以然来,实不是件容易的是,至少对于像我这样的菜鸟来说是这样的,本文出于此种原因,希望对还在寻求此帮助...

VC界面类编程Toolbar制作菜单条过程详解
Toolbar制作菜单条过程详解 现在许多用户界面都使用工具栏制作菜单条,小弟最近对此感兴趣,便从网上求助,可是得到的帮助大多是BCGControlBar的源代码或者是SizableRebar的源代码,对于只希望是自己的界面具有该功能的朋友来说,这也许是不错的选择,只要看一下demo,然后直接调用别人的类库就可以了,但对于我等对此话题感兴趣,希望弄懂其来龙去脉的读者来说,直接看这些没有详细解释的源代码,要从中弄出个所以然来,实不是件容易的是,至少对于像我这样的菜鸟来说是这样的,本文出于此种原因,希望对还在寻求此帮助的读者能提供一些帮助。 下面我们边看边侃: 在接收到toolbarbutton按下消息时,我们一般使用TrackPopupMenuEx弹出菜单,问题的关键是,在菜单未关闭时,TrackPopupMenuEx并不返回,并拦截鼠标和键盘消息,使用spy可以看到,此时的工具栏收不到任何消息,当然无从改变热点,这就需要我们自己探测鼠标位置并在鼠标移动到下一个热点时关闭上一个菜单并显示下一个菜单。这里我们使用钩子函数SetWindowsHookEx在调用TrackPupupMenuEx前安装WH_MSGFILTER钩子,代码如下: m_hMsgHook = SetWindowsHookEx( WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId() ); MssageProc是钩子函数,代码如下: LRESULT CALLBACK  MessageProc(int code, WPARAM wParam, LPARAM lParam) {   if (code == MSGF_MENU)   {     HookMessageProc(lParam);   }   return CallNextHookEx(m_hMsgHook, code, wParam, lParam); } 函数检查消息,如果是来自菜单,则将消息传递给函数HookMessageProc处理,我们所要做的就是在该函数中检测消息WM_MOUSEMOVE,并测试鼠标位置,如果鼠标已经移动到另一个按钮上,则关闭菜单并显示下一个菜单,关闭菜单使用消息WM_CANCELMODE,当菜单关闭后,我们要释放钩子,在下一个菜单弹出时重新安装钩子,弹出菜单示例代码如下: void TrackPopup(HWND hWndToolBar, int iButton) {   while (iButton >= 0)   {     SendMessage(hWndToolBar,TB_SETHOTITEM,iButton,0);     iPopup = iButton;     //安装钩子     g_hMsgHook = SetWindowsHookEx(WH_MSGFILTER, MessageProc, 0, GetCurrentThreadId());     //弹出菜单     TrackPopupMenuEx(…);     //卸载钩子     UnhookWindowsHookEx(g_hMsgHook);     iButton = iNextPop; //下一个弹出项,若为负,则退出   }   SendMessage(hWndToolBar,TB_SETHOTITEM,-1,0); } (经验与建议:如果button使用样式TBSTYLE_DROPDOWN,请不要在消息TBN_DROPDOWN中直接调用该函数,应使用中间消息,然后使用PostMessa个发送该消息,以使TBN_DROPDOWN可以直接返回,否则消除第一个高亮热点是很麻烦的事。) iPopup为当前弹出项,iNextPop为下一个弹出项,这些变量需要在函数HookMessageProc中处理,示例代码如下: void HookMessageProc(MSG * pMsg) {   if (pMsg->message == WM_MOUSEMOVE)   {     int iButton, iCount;     POINT pt = { LOWORD(pMsg->lParam), HIWORD(pMsg->lParam) };     ScreenToClient(hWndToolbar, &pt);     iButton = SendMessage(hWndToolbar, TB_HITTEST, 0, &pt);     iCount = SendMessage(hWndToolbar, TB_BUTTONCOUNT, 0, 0);     if (iPopup != iButton && iButton < iCount && iButton >= 0)     {       iNextPop = iButton;       SendMessage(hWndMain, WM_CANCELMODE, 0, 0); (经验与建议:不要试图在此处调用TrackPopup,我曾试图取消该函数内的while循环,直接在此调用该函数,结果是在TrackPopupMenuEx未返回之前,该函数已被调用)     }     else     {       iNextPop = -1;     }   } } 这里,仅仅处理了鼠标移动消息,真正的菜单还应处理键盘导航消息,详细的代码可以参考 BCGControlBar(http://www.vckbase.com/code/downcode.asp?id=1382) 或SizableRebar(http://www.codeproject.com/docking/sizablerebar/SizableRebar_demo.zip ), 有了这底层框架,这些处理过程应该不再困难,文章所涉及到的一些API函数可以参考msdn。 Msdn上相关 资料 新概念英语资料下载李居明饿命改运学pdf成本会计期末资料社会工作导论资料工程结算所需资料清单 : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/faq/iemenubar.asp http://www.microsoft.com/msj/0199/c/c0199.aspx
本文档为【VC界面类编程Toolbar制作菜单条过程详解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_185921
暂无简介~
格式:doc
大小:28KB
软件:Word
页数:2
分类:互联网
上传时间:2018-09-05
浏览量:5