MFC Tree Control对鼠标右击的响应.

来源:互联网 发布:售电软件是什么 编辑:程序博客网 时间:2024/05/17 03:35

在做聊天程序的时候,想对树形控件进行右键响应.只响应用户,不响应在线用户那一行.

 

 void CClientDlg::OnNMRClickUserTree(NMHDR *pNMHDR, LRESULT *pResult)

{
// TODO: Add your control notification handler code here
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; 
POINT point;
GetCursorPos(&point);   
//把显示器坐标转换为客户区坐标,一定要是tree控件的句柄.主要用来测试用户有没有选中某项.
     ::ScreenToClient(pNMTreeView->hdr.hwndFrom,&point);
UINT   uFlags;   
uFlags=TVHT_ONITEM;   
HTREEITEM   hItem   =   m_UserTree.HitTest(point,   &uFlags);

CMenu menu;

int nID;
//就像上图一样,我只想当用户选中walking时才会有效,选中在线用户也没有用.m_hRoot在我的程序里就是保存在线用户的树.
if   ((hItem   !=   NULL)   &&   (TVHT_ONITEM   &   uFlags)&&(hItem!=m_hRoot))   
{         
m_UserTree.Select(hItem,   TVGN_CARET);   
menu.LoadMenu(IDR_FILE_TRANSFER);
//控制弹出菜单的位置,要用到和上面相反的函数.
::ClientToScreen(pNMTreeView->hdr.hwndFrom,&point);
CMenu* pContextMenu = menu.GetSubMenu(0);
nID = pContextMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD,
point.x, point.y,this);
}   
//下面就是你具体要做的事了,根据菜单项来具体安排.
        switch (nID)
        {
          ......
          }

      *pResult = 0;
}

原文地址:MFC Tree Control对鼠标右击的响应.作者:walking