精华内容
下载资源
问答
  • CTreeCtrl

    2019-03-27 22:28:04
    tree CTreeCtrl https://docs.microsoft.com/zh-cn/cpp/mfc/using-ctreectrl?view=vs-2017 https://baike.baidu.com/item/CTreeCtrl/5024970?fr=aladdin
    展开全文
  • Ctreectrl

    2014-11-04 17:15:03
    MFC中使用CTreeCtrl类来封装树形控件的各种操作。通过调用 BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些树形控件的
    树形控件可以用于树形的结构,其中有一个根接点(Root)然后下面有许多子结点,而每个子结点上有允许有一个或多个或没有子结点。MFC中使用CTreeCtrl类来封装树形控件的各种操作。通过调用
    
    BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些树形控件的专用风格: 


    TVS_HASLINES 在父/子结点之间绘制连线 
    TVS_LINESATROOT 在根/子结点之间绘制连线 
    TVS_HASBUTTONS 在每一个结点前添加一个按钮,用于表示当前结点是否已被展开 
    TVS_EDITLABELS 结点的显示字符可以被编辑 
    TVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点 
    TVS_DISABLEDRAGDROP 不允许Drag/Drop 
    TVS_NOTOOLTIPS 不使用ToolTip显示结点的显示字符 
    在树形控件中每一个结点都有一个句柄(HTREEITEM),同时添加结点时必须提供的参数是该结点的父结点句柄,(其中根Root结点只有一个,既不可以添加也不可以删除)利用
    HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );可以添加一个结点,pszItem为显示的字符,hParent代表父结点的句柄,当前添加的结点会排在hInsertAfter表示的结点的后面,返回值为当前创建的结点的句柄。下面的代码会建立一个如下形式的树形结构: 
    +--- Parent1
        +--- Child1_1
        +--- Child1_2
        +--- Child1_3
    +--- Parent2
    +--- Parent3


    /*假设m_tree为一个CTreeCtrl对象,而且该窗口已经创建*/
    HTREEITEM hItem,hSubItem;
    hItem = m_tree.InsertItem("Parent1",TVI_ROOT);在根结点上添加Parent1
    hSubItem = m_tree.InsertItem("Child1_1",hItem);//在Parent1上添加一个子结点
    hSubItem = m_tree.InsertItem("Child1_2",hItem,hSubItem);//在Parent1上添加一个子结点,排在Child1_1后面
    hSubItem = m_tree.InsertItem("Child1_3",hItem,hSubItem);


    hItem = m_tree.InsertItem("Parent2",TVI_ROOT,hItem);    
    hItem = m_tree.InsertItem("Parent3",TVI_ROOT,hItem);    


    如果你希望在每个结点前添加一个小图标,就必需先调用CImageList* SetImageList( CImageList * pImageList, int nImageListType );指明当前所使用的ImageList,nImageListType为TVSIL_NORMAL。在调用完成后控件中使用图片以设置的ImageList中图片为准。然后调用
    HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);添加结点,nImage为结点没被选中时所使用图片序号,nSelectedImage为结点被选中时所使用图片序号。下面的代码演示了ImageList的设置。 
    /*m_list 为CImageList对象
    IDB_TREE 为16*(16*4)的位图,每个图片为16*16共4个图标*/
    m_list.Create(IDB_TREE,16,4,RGB(0,0,0));
    m_tree.SetImageList(&m_list,TVSIL_NORMAL);
    m_tree.InsertItem("Parent1",0,1);//添加,选中时显示图标1,未选中时显示图标0




    此外CTreeCtrl还提供了一些函数用于得到/修改控件的状态。 
    HTREEITEM GetSelectedItem( );将返回当前选中的结点的句柄。BOOL SelectItem( HTREEITEM hItem );将选中指明结点。 
    BOOL GetItemImage( HTREEITEM hItem, int& nImage, int& nSelectedImage ) / BOOL SetItemImage( HTREEITEM hItem, int nImage, int nSelectedImage )用于得到/修改某结点所使用图标索引。 
    CString GetItemText( HTREEITEM hItem ) /BOOL SetItemText( HTREEITEM hItem, LPCTSTR lpszItem );用于得到/修改某一结点的显示字符。 
    BOOL DeleteItem( HTREEITEM hItem );用于删除某一结点,BOOL DeleteAllItems( );将删除所有结点。 


    此外如果想遍历树可以使用下面的函数: 
    HTREEITEM GetRootItem( );得到根结点。 
    HTREEITEM GetChildItem( HTREEITEM hItem );得到子结点。 
    HTREEITEM GetPrevSiblingItem/GetNextSiblingItem( HTREEITEM hItem );得到指明结点的上/下一个兄弟结点。 
    HTREEITEM GetParentItem( HTREEITEM hItem );得到父结点。 


    树形控件的消息映射使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXTree(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于树形控件可能取值和对应的数据结构为: 


    TVN_SELCHANGED 在所选中的结点发生改变后发送,所用结构:NMTREEVIEW 
    TVN_ITEMEXPANDED 在某结点被展开后发送,所用结构:NMTREEVIEW 
    TVN_BEGINLABELEDIT 在开始编辑结点字符时发送,所用结构:NMTVDISPINFO 
    TVN_ENDLABELEDIT 在结束编辑结点字符时发送,所用结构:NMTVDISPINFO 
    TVN_GETDISPINFO 在需要得到某结点信息时发送,(如得到结点的显示字符)所用结构:NMTVDISPINFO 
    关于ON_NOTIFY有很多内容,将在以后的内容中进行详细讲解。 


    关于动态提供结点所显示的字符:首先你在添加结点时需要指明lpszItem参数为:LPSTR_TEXTCALLBACK。在控件显示该结点时会通过发送TVN_GETDISPINFO来取得所需要的字符,在处理该消息时先将参数pNMHDR转换为LPNMTVDISPINFO,然后填充其中item.pszText。但是我们通过什么来知道该结点所对应的信息呢,我的做法是在添加结点后设置其lParam参数,然后在提供信息时利用该参数来查找所对应的信息。下面的代码说明了这种方法: 


    char szOut[8][3]={"No.1","No.2","No.3"};


    //添加结点
    HTREEITEM hItem = m_tree.InsertItem(LPSTR_TEXTCALLBACK,...)
    m_tree.SetItemData(hItem, 0 );
    hItem = m_tree.InsertItem(LPSTR_TEXTCALLBACK,...)
    m_tree.SetItemData(hItem, 1 );
    //处理消息
    void CParentWnd::OnGetDispInfoTree(NMHDR* pNMHDR, LRESULT* pResult)
    {
    TV_DISPINFO* pTVDI = (TV_DISPINFO*)pNMHDR;
    pTVDI->item.pszText=szOut[pTVDI->item.lParam];//通过lParam得到需要显示的字符在数组中的位置
    *pResult = 0;
    }




    关于编辑结点的显示字符:首先需要设置树形控件的TVS_EDITLABELS风格,在开始编辑时该控件将会发送TVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送TVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMTVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL。下面的代码说明如何处理这些消息: 


    //处理消息 TVN_BEGINLABELEDIT
    void CParentWnd::OnBeginEditTree(NMHDR* pNMHDR, LRESULT* pResult)
    {
    TV_DISPINFO* pTVDI = (TV_DISPINFO*)pNMHDR;
    if(pTVDI->item.lParam==0);//判断是否取消该操作
    *pResult = 1;
    else
    *pResult = 0;
    }
    //处理消息 TVN_BEGINLABELEDIT
    void CParentWnd::OnBeginEditTree(NMHDR* pNMHDR, LRESULT* pResult)
    {
    TV_DISPINFO* pTVDI = (TV_DISPINFO*)pNMHDR;
    if(pTVDI->item.pszText==NULL);//判断是否已经取消取消编辑
    m_tree.SetItemText(pTVDI->item.hItem,pTVDI->pszText);//重置显示字符
    *pResult = 0;
    }


    上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有消息都需要在父窗口中处理)。
    展开全文
  • ctreectrl

    2013-10-23 16:05:02
    原来的网址:... CTreeCtrl点击获得选中项 相应TVN_SELCHANGED可以得到选中的项,在相应函数内如下: LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); CString strSelItemTest


    原来的网址:http://hi.baidu.com/y5254y/item/439f4df4a5a8b52e753c4c16

    CTreeCtrl点击获得选中项

    相应TVN_SELCHANGED可以得到选中的项,在相应函数内如下:

    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);

    CString strSelItemTest = m_mapTreeCtrl.GetItemText(pNMTreeView->itemNew.hItem);

    可以得到选中的项,但这里有一个问题,就是我点击的选中项没有改变时,就触发不了这个函数。

    所以如果每次点击到项上都要得到选中项,相应左右健单双击比较好NM_CLICK    NM_RCLICK    NM_DBCLICK     NM_RDBCLICK

    但是在这几个相应函数里使用

    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);

    CString strSelItemTest = m_mapTreeCtrl.GetItemText(pNMTreeView->itemNew.hItem);

    得到的是上次选中的项,而不是当前选中项

    可以这样解决:

    在这几个相应函数里:

    DWORD   dwpos = GetMessagePos();  
    TVHITTESTINFO ht = {0};  

    ht.pt.x = GET_X_LPARAM(dwpos);
    ht.pt.y = GET_Y_LPARAM(dwpos);
    ::MapWindowPoints(HWND_DESKTOP,pNMHDR->hwndFrom,&ht.pt,1); //把屏幕坐标转换成控件坐标

    TreeView_HitTest(pNMHDR->hwndFrom,&ht);   //确定点击的是哪一项

    CString strSelItemTest = m_mapTreeCtrl.GetItemText(ht.hItem);
        m_mapTreeCtrl.Select(ht.hItem, TVGN_CARET);

    展开全文
  • CTreectrl

    2011-06-03 00:05:00
  • CTreectrl

    千次阅读 2011-01-16 21:54:00
    对于树控制,MFC中也以两种形式来封装,即树控制(CTREECTRL)和树视(CTREEVIEW),来满足用户的不同需求,对于一般要求的用户如在对话框中应用,使用树控制比较方便, 而对于具有较高要求的用户,在使用树视时还...
  • CTreeCtrl是可是化编程中很实用的一个类,可以用于目录结构、层次结构、属性结构
  • CTreeCtrl控件重绘总汇

    2020-10-31 07:04:17
    CTreeCtrl控件重绘总汇,内含八十多个源码 CTreeCtrl控件重绘总汇,内含八十多个源码 CTreeCtrl控件重绘总汇,内含八十多个源码 CTreeCtrl控件重绘总汇,内含八十多个源码
  • CTreeCtrl 自绘

    千次下载 热门讨论 2012-04-15 22:13:11
    CTreeCtrl 实现自绘 达到你要的结果。很好的自绘教程代码
  • CTreeCtrl CheckBox 点击

    2017-03-21 13:47:50
    CTreeCtrl CheckBox 点击选中或取消节点,子节点也选中或取消,并显示出来。
  • CTreeCtrl.cpp

    2014-10-17 11:07:43
    CTreeCtrl 的使用方法,cpp文件,有注释,涵盖CTreeCtrl的基本用法
  • CTreeCtrl的用法

    2013-04-11 17:18:49
    关于CTreeCtrl的一些操作方法,CTreeCtrl
  • CTreeCtrl 控件使用总结

    万次阅读 热门讨论 2018-05-06 09:02:51
    一 基础操作 1 插入节点 1)插入根节点 //插入根节点 HTREEITEM hRoot; CString str=L"ROOT" hRoot=nTreeCtrl.InsertItem(str);... hRoot=nTreeCtrl.InsertItem(str,TVI_ROOT,TVI_LAST);...2)插...
  • ctreectrl scrollbar 如何绘制ctreectrl scrollbar 如何绘制ctreectrl scrollbar 如何绘制ctreectrl scrollbar 如何绘制
  • ctreectrl基本操作

    2014-05-28 09:40:05
    CTreeCtrl的功能.如移动.添加.删除节点 CTreeCtrl添加删除节点等,来源于网络,分享下。
  • ctreectrl fuzhizhantie

    2010-12-31 00:07:07
    ctreectrl fuzhizhantiectreectrl fuzhizhantiectreectrl fuzhizhantie

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,347
精华内容 1,738
关键字:

ctreectrl