我给工具栏上的添加了下拉按钮,弹出菜单
代码: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()函数改变窗口的位置并显示窗口
代码: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()函数改变窗口的位置并显示窗口
解决方案 »
- 求助一个关于用VS2010修改现有VC++项目界面的问题
- 使用VC6.0的问题
- 如何把树形视图控件里的文件夹着成几种颜色。
- 用CDHTMLDialog的SetElementHtml函数设置HTML出现乱码
- 关于输出的问题,篮球比分纪录的分屏幕输出~
- CFile能处理多大的文件?(二进制格式)
- 绘图!!!!
- ----------------怎么取出 HTML 文件资源的内容?-----------------
- 大侠帮忙呀:我想更改工程编译出的可执行文件和帮助文件的名称,该如何操作
- MFC菜鸟,急~~~~~~~关于MFC函数重载的问题。。
- MFC 控制台输出
- 为Com接口方法分配的指针释放内存,什么时候该用CoTaskMemFree,什么时候该用CoGetMalloc然后再Release()?
可以通过UPDATE_COMMAND_UI来控制状态
通过SetCheck可以实现按下或抬起
谢谢你,这个我试过,可以的。不过我想问的是这些菜单,我没有激活,使用TrackPopupMenu函数一样可以做到那种效果,
就是执行到TrackPopupMenu()显示菜单之后,其后的语句就不执行了,要等到菜单消失才继续执行。
也就是TrackPopupMenu()函数内部处于等待了。有人知道是怎么实现的吗
用模态的对话框是可以的,可是我的窗口是从CWnd类派生的。这样的话,怎么弄?