我给工具栏上的添加了下拉按钮,弹出菜单
代码:BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_NOTIFY(TBN_DROPDOWN,AFX_IDW_TOOLBAR,OnToolBarDropDown)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//.......省略....//效应下拉按钮消息
void CMainFrame::OnToolBarDropDown(NMTOOLBAR* pnmtb, LRESULT* plRes)
{
int nMenuItem ;
int nSubMenuItem ;
CRect rcBtn ;
UINT nID;
CWnd  * pWnd;
pWnd = NULL ;
pWnd = &m_wndToolBar;
nID = IDR_GRAPHITYPE;

pWnd->SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rcBtn);
pWnd->ClientToScreen(&rcBtn);
// 根据下拉按钮id的不同,做不同的处理
switch (pnmtb->iItem)
{
case IDM_DELETE: 
nMenuItem = 1 ; //加载一层菜单----"编辑"
nSubMenuItem = 2 ; //加载二层菜单---- "删除"
break;
case ID_FILL_COLOR:   //显示调色板
new CColorPopUp(CPoint(rcBtn.left,rcBtn.bottom ), GetColor() , this , _T("自定义颜色(&C)..."));
    default:
return;
}

     // 加载弹出菜单
CMenu menu;
menu.LoadMenu(nID);
CMenu * pSysMenu  = menu.GetSubMenu(nMenuItem);  if(pSysMenu == NULL) return ;
CMenu * pSubMenu  = pSysMenu->GetSubMenu(nSubMenuItem);  ASSERT(pSubMenu != NULL);
 
if(pSubMenu == NULL)  return ;
pSubMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rcBtn.left, rcBtn.bottom, this, &rcBtn); 
}
/
按下下拉按钮的时候,可以弹出菜单,当菜单弹出的时候,按钮会凹下去,当菜单消失时,按钮恢复原状。
现在我想通过点击下拉按钮弹出自己做的窗口,也要达到这种效果即窗口弹出时,按钮凹下,窗口消失,按钮恢复。
代码如上红色部分。但是这样就是没有弹出菜单时的效果。
因为使用new 创建的窗口,是非模态的,即使创建了窗口,该函数还是之后的部分还是继续执行。
但是TrackPopupMemu则会等菜单消失之后其后的语句才会执行。所以有什么办法可以达到TrackPopupMemu函数的效果,能够在new创建窗口后,依然等待。PS:我的类是从CWnd类派生的,使用的MoveWindow()函数改变窗口的位置并显示窗口

解决方案 »

  1.   

    我记得toolbar的按钮的状态控制和菜单是一致的
    可以通过UPDATE_COMMAND_UI来控制状态
    通过SetCheck可以实现按下或抬起
      

  2.   


    谢谢你,这个我试过,可以的。不过我想问的是这些菜单,我没有激活,使用TrackPopupMenu函数一样可以做到那种效果,
    就是执行到TrackPopupMenu()显示菜单之后,其后的语句就不执行了,要等到菜单消失才继续执行。
    也就是TrackPopupMenu()函数内部处于等待了。有人知道是怎么实现的吗
      

  3.   

    谢谢楼上的回复
    用模态的对话框是可以的,可是我的窗口是从CWnd类派生的。这样的话,怎么弄?