|
Toolbar制作菜单条过程详解(2) } 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)
|