炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3020|回复: 8

一个API ,XMenu_Popup 里面的问题

[复制链接]

该用户从未签到

发表于 2014-6-11 17:18:29 | 显示全部楼层 |阅读模式
多次调用后,程序直接退出,没有崩溃信息和调用堆栈等,
看调试输出里面是 :在API:XWnd_SetWindowPos()中,[XC_WINDOW]输入句柄可能无效
XMenu_Popup 没有提示句柄异常 ,有没有知道怎么回事儿的~~~
  • TA的每日心情
    开心
    2022-1-9 18:18
  • 发表于 2014-6-11 22:04:38 | 显示全部楼层
    你提供的信息太少无法分析问题.
    XMenu_Popup() 不能重复调用,菜单消失之后自动销毁,除非你设置了手动销毁.

    该用户从未签到

     楼主| 发表于 2014-6-12 08:54:07 | 显示全部楼层
    admin 发表于 2014-6-11 22:04
    你提供的信息太少无法分析问题.
    XMenu_Popup() 不能重复调用,菜单消失之后自动销毁,除非你设置了手动销毁. ...

    感谢管理大大的回复, 基本实现是这样的,设置了手动销毁,然后就是用一排按钮实现类似于Menubar的效果,当鼠标移动到某个按钮上,则显示菜单,鼠标一直移动,则隐藏前一个按钮的菜单,显示后一个按钮的菜单,这样不停移动的话,移动个十多次程序就直接退出了,错误输出就是上面的那个

    该用户从未签到

     楼主| 发表于 2014-6-12 09:28:14 | 显示全部楼层
    1. //显示菜单
    2. void CPathControlNode::ShowMenu()
    3. {
    4.         //获取到屏幕坐标位置
    5.         CRect rectNode;
    6.         XEle_GetWndClientRect(m_hNode,&rectNode);
    7.         CPoint ptMenu(rectNode.left + rectNode.Width() / 2,rectNode.bottom);
    8.         ClientToScreen(XEle_GetHWnd(m_hNode),&ptMenu);
    9.         m_bStaIsMenuOn = TRUE;
    10.         CString strOut = m_strDirName + L"菜单的显示\n";
    11.         OutputDebugString(strOut);
    12.         if(m_hMenu)
    13.                 CHECK(XMenu_Popup(m_hMenu,XEle_GetHWnd(m_hNode),ptMenu.x,ptMenu.y));
    14. }
    复制代码
    1. //隐藏菜单
    2. void CPathControlNode::HideMenu()
    3. {
    4.         if(m_hMenu)
    5.         {
    6.                 CString strOut = m_strDirName + L"菜单的隐藏\n";
    7.                 OutputDebugString(strOut);
    8.                 XMenu_CloseMenu(m_hMenu);
    9.         }
    10. }
    复制代码
    1. BOOL CPathControlBar::OnMouseMove(CPoint point)
    2. {
    3.         ScreenToClient(m_hWndParent,&point);
    4.         CRect rectCtrl;
    5.         XEle_GetRect(m_hPathEle,&rectCtrl);
    6.        
    7.         if(rectCtrl.PtInRect(point))
    8.         {
    9.                 XEle_PointWndClientToEle(m_hPathEle,&point);
    10.                 CPathControlNode* pathNode = HitTest(point.x,point.y);
    11.                 //成功获取到对应元素 并且此元素与上次鼠标坐标所在的元素不同
    12.                 if(pathNode && pathNode != m_pOldNode)
    13.                 {
    14.                         //隐藏掉原先元素上的菜单
    15.                         if(m_pOldNode)
    16.                                 m_pOldNode->HideMenu();
    17.                         m_pOldNode = pathNode;
    18.                         //显示新的菜单
    19.                         pathNode->ShowMenu();
    20.                        
    21.                 }
    22.         }
    23.         return FALSE;
    24. }
    复制代码
    用鼠标钩子截获的鼠标移动消息,然后

    该用户从未签到

     楼主| 发表于 2014-6-12 09:29:35 | 显示全部楼层
    1. //加载菜单信息
    2. BOOL CPathControlNode::LoadDirMenu()
    3. {
    4.         //创建菜单
    5.         m_hMenu = XMenu_Create();
    6.         ECHECK(m_hMenu);
    7.         if(!m_hMenu)        return FALSE;
    8.        
    9.         //设置菜单非自动销毁
    10.         XMenu_SetAutoDestroy(m_hMenu, FALSE);

    11.         //搜索本文件夹内的子文件夹
    12.         vector<CString> vecDirs;
    13.         vecDirs.push_back(L"新建文件夹");
    14.         vecDirs.push_back(L"新建文件夹Ex");

    15. //        m_hDirIcon = XImage_LoadFileEx(L"Res\\IShare.ico",TRUE);
    16.        
    17.         if(!vecDirs.empty())
    18.         {
    19.                 m_mapIDToDirName.clear();
    20.                 for(int i = 0;i < vecDirs.size();i ++)
    21.                 {
    22.                         m_mapIDToDirName[m_nCommondBase] = vecDirs[i];
    23.                         XMenu_AddItem(m_hMenu,
    24.                                                         m_nCommondBase,
    25.                                                         vecDirs[i].GetBuffer(),
    26.                                                         XMENU_ROOT,
    27.                                                         0);
    28.                        
    29.                         m_nCommondBase ++;
    30.                 }
    31.                 return TRUE;
    32.         }
    33.         return FALSE;
    34. }
    复制代码
    这是加载菜单的那部分,元素创建的时候调用的

    该用户从未签到

     楼主| 发表于 2014-6-12 10:56:54 | 显示全部楼层
    梦飞 发表于 2014-6-12 10:39
    BUG提交格式:
    版本号:v1.6.2
    开发环境:vs2008

    额? 这些要我填一下吗?
  • TA的每日心情
    开心
    2022-1-9 18:18
  • 发表于 2014-6-12 23:28:45 | 显示全部楼层
    你下载 v1.6.3 版本试试,如果还是有问题,留下你的QQ号,我调试下代码.
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

    GMT+8, 2024-9-20 01:15 , Processed in 0.067358 second(s), 18 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表