我现在做一个tree类似于vc左侧的FileView,包含文件夹和文件夹里的文件
现在我的代码:
//图标位图
pTreeImageList =   new   CImageList();   
pTreeImageList->Create(IDB_BITMAP1, 16, 0, RGB (255,   0,   0));
m_TreeCtrl.SetImageList   (   pTreeImageList,   TVSIL_NORMAL   ); 
//插入item,其中第二个参数0是文件夹关闭状态,第三个参数1是文件夹打开状态
InsertItem( ItemName,   0,   1,   0   );   
这样当鼠标选择文件夹时是文件夹打开状态,选择其他文件夹或文件时,前面的文件夹是关闭状态,这样只有一个文件夹是打开的状态。
现在我想当无论我选择文件或文件夹时,上级文件夹依然保持打开状态,只有双击或点击加号时,文件夹关闭。如果我说的不够明白,大家可以看看VC的FileView,我就是想做个那样的tree.
现在我想用SetItemImage来实现,应该怎么做,或者有什么其他的更好的办法?

解决方案 »

  1.   

    这样吧,如果文件夹里有子文件夹,当这个节点展开时,也就是这个文件夹打开(显示打开图标),如果没有子文件夹的节点,当双击后也显示打开图标。你可以跟据节点的状态来设置节点的图标,不然的话你还可以通过SetItemData来保存自定义状态,这就由你自已定了。
      

  2.   

    还有个问题,就是当我点“+”时相当于双击该文件夹(打开文件夹),点“-”时相当于双击该文件夹(关闭文件夹)。但每次点加号的动作是在OnLButtonDown(单击事件)处理的,而我双击图标的事件是在OnLButtonDblClk处理的。这样就矛盾了,这该怎么处理?
      

  3.   

    本来就应该在OnExpand函数下设置Iamge图标,这样才能保证用户用方向键或者鼠标都可以操作原理就是,当节点Expand的时候,设置图标为文件夹打开图标,当节点Collapse的时候,设置图标为文件夹打开图标。
      

  4.   

    一个节有分几个区的,这个区可以通过HitTest捕获。详情请看参见:
    -------------------------------------HTREEITEM HitTest(
       CPoint pt,
       UINT* pFlags = NULL
    ) const;pt
    Client coordinates of the point to test. flags
    Variable that receives information about the results of a hit test. This member can be one or more of the following values: TVHT_ABOVE
    Above the client area. 
    TVHT_BELOW
    Below the client area. 
    TVHT_NOWHERE
    In the client area, but below the last item. 
    TVHT_ONITEM
    On the bitmap or label associated with an item. 
    TVHT_ONITEMBUTTON
    On the button associated with an item. 
    TVHT_ONITEMICON
    On the bitmap associated with an item. 
    TVHT_ONITEMINDENT
    In the indentation associated with an item. 
    TVHT_ONITEMLABEL
    On the label (string) associated with an item. 
    TVHT_ONITEMRIGHT
    In the area to the right of an item. 
    TVHT_ONITEMSTATEICON
    On the state icon for a tree-view item that is in a user-defined state. 
    TVHT_TOLEFT
    To the left of the client area. 
    TVHT_TORIGHT
    To the right of the client area.
      

  5.   

    楼上的,在还未点击文件夹的时候,就应该显示文件夹的图标,你说的是不是在Expand时再重新设置一下图标的Iamge啊?
      

  6.   

    有没有判断item是否展开的函数?
      

  7.   

    你就多用一个HTREEITEM记录前一次打开的地方,到时关闭就是了
      

  8.   

    if(GetItemState(hItem, TVIF_STATE) & TVIS_EXPANDED)
    {
       // Expanded
    }
    else
    {
       // Not expand
    }
      

  9.   

    不好意思,关于HitTest我应该用哪个参数呢?我想点击左侧的+号,而不点文件夹
    函数形式是用这个吗?
    HTREEITEM HitTest( TVHITTESTINFO* pHitTestInfo );
    我原来是用HTREEITEM hItem =HitTest(point);
    现在基本问题已经解决了,只是点文件夹和+号有时会产生冲突