读书人

Treectrl右键菜单工作不正常解决方法

发布时间: 2012-11-07 09:56:10 作者: rapoo

Treectrl右键菜单工作不正常
现在的问题是:当插入root item >= 10时,右键菜单就工作不正常。
右键菜单在判断选中的是root item 或 child item就只判断为一种,
即只为root item或child item。
root item插入用以下函数:
InsertItem(_T("新加组"),0,0,TVI_ROOT,TVI_LAST);
child item插入用以下函数:
InsertItem(_T("李四"),2,2,m_hTreeitemHit,TVI_LAST);
m_hTreeitemHit:为选中的item。

C/C++ code
//右键弹出菜单如下void CGuiTreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) {    // TODO: Add your control notification handler code here        POINT point;    UINT uFlags = 0x00;    bool bIsRootandNull = false;        if(!GetCursorPos(&point))        return;      ScreenToClient(&point);         HTREEITEM hItem   =   HitTest(point,   &uFlags);        //得到选中的项      if ((hItem != NULL) && (TVHT_ONITEM & uFlags))    {        SelectItem(hItem);                    //设置为选中状态        m_hTreeitemHit = hItem;                    //保存选中的item    }    else    {        bIsRootandNull = true;    }        HTREEITEM hRoot[MAXROOTNUM];    unsigned char i = 0x00;        if(bIsRootandNull == false)    {        hRoot[i] = GetRootItem();                //枚举所有根节点        while(hRoot[i])          {              hRoot[i+1] = GetNextItem(hRoot[i], TVGN_NEXT);             i++;        }                for (int j = 0x00; j < i; j++)        {            if (hItem == hRoot[j])                //如果右击根节点            {                    bIsRootandNull = true;                break;            }        }    }    if (bIsRootandNull == true)                    //在根节点或没有选中任何节点    {        DWORD dwPos = GetMessagePos();        CPoint point( LOWORD(dwPos), HIWORD(dwPos) );        CMenu menu;                if (hItem == NULL)        {            VERIFY( menu.LoadMenu( ID_RCLICKNULLMENU) );        }         else        {            VERIFY( menu.LoadMenu( ID_RCLICKROOTMENU) );        }        CMenu* popup = menu.GetSubMenu(0);        ASSERT( popup != NULL );        popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,                            point.x, point.y, this );    }        else                            //选中子节点    {            DWORD dwPos = GetMessagePos();        CPoint point( LOWORD(dwPos), HIWORD(dwPos) );        CMenu menu;                VERIFY( menu.LoadMenu( ID_RCLICKCHILDMENU) );        CMenu* popup = menu.GetSubMenu(0);        ASSERT( popup != NULL );        popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,                            point.x, point.y, this );    }    *pResult = 0;}

都不知道是不是右键菜单处理出了问题还是其它的。

[解决办法]
简单点,你调试一下,看进入OnRclick()中了吗?或者是进入OnRclick()中了,哪里return返回了,一般添加右键菜单是相应WM_CONTEXTMENU消息。。。

读书人网 >VC/MFC

热点推荐