void CMytreeDlg::OnNMRclickTree1(NMHDR *pNMHDR, LRESULT *pResult)函數
{ this
CPoint point(GetMessagePos()); spa
unsigned int nFlags = 0; 調試
m_tree.ScreenToClient(&point); orm
HTREEITEM hItem = m_tree.HitTest(point,&nFlags); ci
if ((nFlags& TVHT_ONITEM) &&(hItem!=NULL))資源
{ it
m_tree.SetFocus(); io
m_tree.SelectItem( hItem ); ast
CMenu MyMenu;
MyMenu.LoadMenu(IDR_MENU1);//加載菜單資源
CMenu* popup=MyMenu.GetSubMenu(0);
GetCursorPos(&point);//獲取當前光標的位置,以便使得菜單能夠跟隨光標這裏也能夠用m_tree.ClientToScreen(&point);
popup->TrackPopupMenu(TPM_LEFTBUTTON|TPM_LEFTALIGN,point.x,point.y,this);
}
// TODO: 在此添加控件通知處理程序代碼
*pResult = 0;
}
須要注意的是客戶與屏幕座標的轉換問題,注意 GetCursorPos返回屏幕座標,HitTest使用的是客戶座標。這裏的GetCursorPos也可換成GetmessagePos 除了用法稍有不一樣我沒發現實際調試後有什麼不一樣之處MSDN裏是這樣描述其不一樣之處的:要獲得光標的當前位置而不是上一個消息發生時的位置,調用函數GetCursorPos。