最近在写一个CMenuBar,就是做一菜单栏大部分的工作做完了,就有一个头疼问题:按组键时要弹出菜单,如Alt+F要弹出  "文件(F)"下的子菜单
但是TrackPopupMenuEx好像只能在鼠标点击后才能起作用,
具体问题看个这程序:http://www36.websamba.com/wzb13/MenuBarTestSDI.rar运行后按Alt+F Alt+V等,就能看出问题了我用下面程序处理Alt+?//发送到Main Frame Window的消息都要经过这里
LRESULT CMenuBar::FrameMessageProc(HWND hWnd,UINT nID,WPARAM wParam,LPARAM lParam)
{
.............
if(nID==WM_MENUCHAR)
{
//MenuCharMap是自己定义的成员函数,用来确定是哪一个按钮被按下了
int nIndex=MenuCharMap(LOWORD(wParam));
if(nIndex!=-1)
{
PopupSubMenu(nIndex);//弹出菜单
}
return TRUE;//返回TRUE,则消息不再经Main Frame窗口处理
}
return FALSE;
}CMenuBar是由CControlBar继承来的,上面的按钮并不是用的CButton类,而是直接画的,响应鼠标事件是由CMenuBar处理的。问题就出在这里。如果是用CButton就好办了.我已前是把PopupSubMenu(nIndex)放在OnCommand(...){....}里面,然后在要菜单弹出的时候发送WM_COMMAND,可以让菜单正常弹出来,现在却不行了!有什么方法能不点鼠标就弹出菜单?请向手指点!

解决方案 »

  1.   

    nID==WM_MENUCHAR看来根本就没进去
      

  2.   

    WM_MENUCHAR
    The WM_MENUCHAR message is sent when a menu is active and the user presses a key that does not correspond to any mnemonic or accelerator key. This message is sent to the window that owns the menu. A window receives this message through its WindowProc function. 
    你的窗口根本没有菜单,这样做肯定是不行的
    实际上ALT+F是两步,按ALT将焦点设到菜单,再按F弹出相应的菜单
    楼主应该先从WM_SYSKEYUP截获VK_MENU, 重画第一项菜单并设一个标志位,然后从WM_KEYDOWN截获F,判断标志位后PopupSubMenu弹出菜单
      

  3.   

    nID==WM_MENUCHAR看来根本就没进去
    ---------------------------------------进去了啊,按Alt+F,可以看到 "文件(F)"按钮按下去又弹起来的!
    看不清可按住Alt+F不放
      

  4.   

    WM_SYSKEYUP截获VK_MENU, 重画第一项菜单并设一个标志位,然后从WM_KEYDOWN
    -------------------------------------------------------------------------这样做的确可以,问题也已经解决了,Menu bar也告成了。就是有一点不明白,
    if(nIndex!=-1)
    {
    PopupSubMenu(nIndex);//为什么这一句明明执行了,菜单就是弹不出来呢?
    }
      

  5.   

    怎么不用MFC呢?实现这些功能都不用编程的了!
      

  6.   

    有可能是在之后收到一个WM_CANCELMODE之类的消息