问一个关于CMenu弹出的问题,为何无法弹出呢?

kbsoft 2011-07-19 11:01:27
TrackPopup来弹出菜单,代码如下:
void ShowSubMenu(FAVORITE fav, int n)
{
CSimpleArray<FAVORITE> favorites = _Module.m_FavoriteConfig.GetFavoritesByNode(fav.Node);

CPoint point(m_Controls[n].rect.left, m_Controls[n].rect.bottom);
ClientToScreen(&point);

int nMenuHeight = ::GetSystemMetrics(SM_CYMENU);
int nScreenHeight = GetSystemMetrics(SM_CYFULLSCREEN);
int nMaxCount = (nScreenHeight - point.y - 50) / nMenuHeight;

CMenuHandle menu;
menu.CreatePopupMenu();

menu.AppendMenu(MF_STRING, 4000 + m_MenuFavorites.GetSize(), _T("收藏到此文件夹下"));
menu.AppendMenu(MF_STRING, 5000 + m_MenuFavorites.GetSize(), _T("打开此文件夹下所有链接"));
menu.AppendMenu(MF_SEPARATOR);
m_MenuFavorites.Add(fav);

if (favorites.GetSize() >= 0)
{
for (int i = 0; i < favorites.GetSize(); i++)
{
DWORD dwExtraAttr = ((i + 4) % nMaxCount == 0) && _Module.m_Config.GetFavoriteMultiCol() ? MF_MENUBARBREAK : 0;
FAVORITE * pFav = &favorites[i];

CString title = pFav->Title.GetLength() > 30 ? pFav->Title.Left(30) + _T("...") : pFav->Title;
if (pFav->IsFolder)
{
m_MenuFavorites.Add(*pFav);
AddSubMenu(menu, dwExtraAttr, pFav, 2);
}
else
{
menu.AppendMenu(MF_STRING | dwExtraAttr, 1000 + m_MenuFavorites.GetSize(), title);
m_MenuFavorites.Add(*pFav);
}
}

MENUINFO menuInfo;
menuInfo.cbSize = sizeof(MENUINFO);
menuInfo.dwStyle = MNS_DRAGDROP;
menuInfo.fMask = MIM_STYLE;
menu.SetMenuInfo(&menuInfo);

UINT uCmd = menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_LEFTALIGN | TPM_RETURNCMD, point.x, point.y, m_hWnd);

menu.DestroyMenu();
}

}


这样可以正常显示菜单,但是如果我现在想实现按住鼠标后(不放开),就是拖动,移开菜单后,然后关闭这个菜单,鼠标移动到另外的菜单上,此时鼠标未释放,但再也打不开任何菜单了,不知有什么方法可以做到呢?

我想实现鼠标拖拽到不同的菜单上时,弹出不同的菜单(鼠标不释放的情况下)
...全文
98 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdl2005lyx 2011-08-12
  • 打赏
  • 举报
回复
楼主,代码的问题别人很难帮你查,你只能自己慢慢调试,
不过,给你提个思路:

不要动态参加菜单,直接在资源那边静态创建!
向立天 2011-08-12
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
changkai2009 2011-07-19
  • 打赏
  • 举报
回复
初学者,你这比较高深看不懂=-=!
kbsoft 2011-07-19
  • 打赏
  • 举报
回复
就是类似浏览器里收藏栏菜单内,拖动菜单项到另外一个菜单里的效果。
快乐鹦鹉 2011-07-19
  • 打赏
  • 举报
回复
实在看不懂你在问什么......
lironghua2012 2011-07-19
  • 打赏
  • 举报
回复
他是想把菜单做成浮动窗口一样,可以任意地拖动位置
从VC++项目中的菜单资源建立结构相同的自绘弹出式菜单,原理和步骤如下: (1)CMenu::LoadMenu读入菜单资源; (2)CImageList::Create读入工具栏位图; (3)CMenu::CreatePopupMenu和CMenu::AppendMenu拷贝菜单资源,建立弹出式菜单。其中CMenu::AppendMenu第1个参数设置成MF_OWNERDRAW(自绘), 第四个参数设置成一个附加结构的指针,包括菜单项文字和位图索引等信息。通过这个结构,在自绘制时,可以获取对应的菜单项文字和位图位置索引,其中位图保存在第(2)步中的CImageList变量中; (4)在对右鼠标键的响应函数里,使用CMenu::TrackPopupMenu启动显示弹出式菜单; (5)在弹出式菜单的拥有者窗口(CxxxView)里,处理WM_MEASUREITEM消息和WM_DRAWITEM消息,分别调用CMenuEx::MeasureItem和CMenuEx::DrawItem, 分别用来定义菜单项的尺寸,对菜单项进行自绘; (6)在自绘函数CMenuEx::DrawItem里,通过每个菜单项的附加结构lpDIS->itemData,获得其文字和位图索引,然后分别使用CDC::DrawText和CImageList::Draw,画出该菜单项的文字和位图,从而实现自绘制。 程序在VC6下编译通过。 没有处理的地方:如果菜单项状态是checked或者radio,程序没做处理。另外,弹出式菜单的激活/禁止时,不会自动触发其拥有者窗口的ON_UPDATE_COMMAND_UI宏。不过,可以处理owner窗口的WM_INITMEMUPOPUP消息(在弹出式菜单的每个子菜单弹出时,都会发出此消息),为每个子菜单项单独生成一个CCmdUI对象,调用其CCmdUI::DoUpdate函数,来手动触发ON_UPDATE_COMMAND_UI宏中对应的消息处理函数,使得菜单项能够根据应用环境进行激活和禁止。详见博客: http://oliver.zheng.blog.163.com/blog/static/14241159520143210595266/

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧