这里是树状目录的初始化
void CDirTreeCtrl::Initialize()
{
LPITEMIDLIST pidl = NULL;
SHGetSpecialFolderLocation(*this, CSIDL_DESKTOP, &pidl);
    
    SHFILEINFO sfi;
ZeroMemory(&sfi, sizeof(SHFILEINFO));
HIMAGELIST hSysImageList = (HIMAGELIST) SHGetFileInfo((LPCTSTR)pidl, 0,
&sfi, sizeof(SHFILEINFO), SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); m_pMalloc->Free(pidl);

TreeView_SetImageList(*this, hSysImageList, TVSIL_NORMAL); RefreshShellRoot(NULL);
}自己编的一个树状目录列表,在做右键点击一个目录然后在下面新建一个目录,该目录名字一开始是一个等待输入的状态,遇到了2个问题
1)如何右键点击一个目录的同时如何选中它
考虑了用hittest测试得到选择项的句柄,但是使用ClassWizard响应NM_RCLICK
消息里的NMHDR参数得到的点击点坐标位置(传给hittest判断用)似乎不对,不知道
如何得到正确的坐标位置传给hittest
2)为什么那个输入目录的小Edit控件没出来,看了msdn似乎用下EditLabel就可以啊,但是我用了以后返回的Edit控件的指针是空的,所以一直没出来那个输入控件,我贴代码HTREEITEM CDirTreeCtrl::AddNewDirectory()
{
HTREEITEM currentSelectedItem=GetSelectedItem();
if(currentSelectedItem==NULL)
return NULL; if(Expand(currentSelectedItem, TVE_EXPAND)==FALSE)
return NULL; HTREEITEM item;
TV_INSERTSTRUCT tvstruct;
tvstruct.hParent=currentSelectedItem;
tvstruct.item.pszText=_T("new");
tvstruct.hInsertAfter=TVI_LAST;
tvstruct.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE| TVIF_PARAM;
tvstruct.item.iImage=5;
tvstruct.item.iSelectedImage=5;
item=InsertItem(&tvstruct);
SetFocus(); TVITEM tvItem;
tvItem.hItem=currentSelectedItem;
BOOL t=GetItem(&tvItem);
m_currentEditItemChildren=tvItem.cChildren;
tvItem.cChildren=1;
SetItem(&tvItem);
//UINT test3=GetItemState(currentSelectedItem, TVIF_CHILDREN);
//UINT test4=TVIS_BOLD;
BOOL test=Expand(currentSelectedItem, TVE_EXPAND);
BOOL test2=EnsureVisible(item);
SetFocus();
CEdit* pedit=EditLabel(item);  //pedit是空的,很奇怪 return item;
}
3ks!!!!

解决方案 »

  1.   

    1)如何右键点击一个目录的同时如何选中它
    考虑了用hittest测试得到选择项的句柄,但是使用ClassWizard响应NM_RCLICK
    消息里的NMHDR参数得到的点击点坐标位置(传给hittest判断用)似乎不对,不知道
    如何得到正确的坐标位置传给hittest
    ==用GetCursorPos函数获取点击位置
      

  2.   

    to happyparrot(为何我买彩票从来不中奖?没钱怎么办阿?) 
    试了下得到的point还是不对,有(800,400)这样,没那么大啊,是不是它的坐标系是相对屏幕的?但是也不对啊,我点的位置在屏幕的左上方也不会是这个数值啊
      

  3.   

    GetCursorPos()
    pTreeCtrl->ScreenToClient(&point); //转换坐标系统
      

  4.   

    GetCursorPos不一定准确,因为你去取的时候,鼠标可能已经移走了.最好还是用它传给你的坐标.不知道它传给你的坐标怎么不对了,可能是屏幕坐标,也可能是相对你的TREE的坐标,你要测一下
      

  5.   

    GetCursorPos不一定准确,因为你去取的时候,鼠标可能已经移走了.最好还是用它传给你的坐标.不知道它传给你的坐标怎么不对了,可能是屏幕坐标,也可能是相对你的TREE的坐标,你要测一下
      

  6.   

    to laiyiling(陌生人 V2.0) 
    我是这么做的,但是我发现无论怎么拖动窗口到那个位置,getcursorpos的位置都是不怎么变化的,而理论上来说Screentoclient转换后,只要鼠标点击位置相对窗口不变,那么转换以后的结果都一样,但是实际情况是拖动整个窗口以后它变化很大...
      

  7.   

    void CDirTreeCtrl::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    NMITEMACTIVATE * nmia = (NMITEMACTIVATE*)pNMHDR;
    CPoint point(nmia->ptAction);
    ...是不是这里这个pNMHDR在treectrl里不能强制转换为NMITEMACTIVATE?这个我是从listctrl里copy过来的代码改了在tree里用的,在treectrl里这里得到的坐标有误
      

  8.   

    实现右键选中的代码void CSourcePropertyDlg::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    HWND hTree = ::GetDlgItem( m_hWnd, IDC_TREE1 );HTREEITEM hSelected = ( HTREEITEM )::SendMessage( hTree, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0 );
    if( hSelected != NULL )
    {
    ::SendMessage( hTree, TVM_SELECTITEM, TVGN_CARET, ( LPARAM )hSelected );
    }* pResult = 0;
    }
      

  9.   

    貌似没用,返回的hSelected是NULL
      

  10.   

    先GetCursorPos()
    然后HitTest()
      

  11.   

    void CMyTreeCtrl::OnRButtonDown(UINT nFlags, CPoint point) 
    {
    UINT uFlags;
    HTREEITEM htreeItem = HitTest(point, &uFlags);
    if ((htreeItem != NULL) && (uFlags & TVHT_ONITEM))
    {
    Select(htItem, TVGN_DROPHILITE);
    ClientToScreen(&point);
                      //。。
             }
    CTreeCtrl::OnRButtonDown(nFlags, point);
    }