mfcツリーコントロールTree Control変更削除ノードの追加

18477 ワード

1.ツリーコントロールの通知メッセージ
ツリーコントロールの通知メッセージはたくさんあります.TVN_SELCHANGINGとTVN_SELCHANGED:ユーザーがツリーノードの選択を変更すると、コントロールはこの2つのメッセージを送信します.メッセージにはNMTREEVIEW構造へのポインタが付属し、プログラムはその構造から必要な情報を得ることができる.両方のメッセージは、構造のitemOldメンバーに元の選択項目情報が含まれ、itemNewメンバーに新しい選択項目の情報が含まれ、actionメンバーにユーザーのどのような動作が通知メッセージをトリガーしたかを示す(TVC_BYYEYBOARDであればキーボード、TVC_BYMOUSEであればマウス、TVC_UNKNOWNであれば不明).両メッセージの違いは、TVN_SELCHANGINGのメッセージ処理関数がTRUEに戻ると選択の変更が阻止され、FALSEに戻ると変更が許可される点である.
TVN_KEYDOWN:このメッセージはキーボードイベントを示しています.メッセージにはNMTVKEYDOWN構造を指すポインタが付属しており、この構造プログラムでキーの情報を得ることができます.
TVN_BEGINLABEEDITおよびTVN_ENDLABEEDIT:ユーザーがノードの編集および編集を開始したときに送信されます.メッセージには、NMTVDISPINFO構造へのポインタが付属しており、この構造から必要な情報を得ることができます.前者のメッセージ処理関数では、GetEditControl()を呼び出すことができます.メンバー関数は、タイトルを編集するための編集ボックスへのポインタを返します.処理関数がFALSEに戻った場合、編集は許可され、TRUEに戻った場合、編集は禁止されます.後者のメッセージ処理関数では、NMTVDISPINFO構造のitem.pszTextが編集後の新しい問題を指し、pszTextがNULLの場合、ユーザーが編集を放棄したことを示します.そうでなければ、プログラムはより責任を負います新しいノードのラベルです.これは、SetItem()またはSetItemText()関数で実行できます.
2.ツリーコントロールの関連データ構造
  • NMTREEVIEW構造体NMTREEVIEW構造体には、ツリーコントロール通知メッセージに関する情報が含まれています.ツリーコントロールのほとんどの通知メッセージには、その構造体へのポインタがあります.NMTREEVIEW構造体の定義は、
  • です.
    typedef struct tagNMTREEVIEW {   
        NMHDR hdr;      //    NMHDR     
        UINT action;    //                      
        TVITEM itemOld; //          
        TVITEM itemNew; //          
        POINT ptDrag;   //                 
    } NMTREEVIEW, *LPNMTREEVIEW;  
    TVINSERTSTRUCT構造体
  • ツリーコントロールに新しいノードを挿入するには、TVINSERTSTRUCT構造体を使用する必要があります.TVM_INSERTITEMメッセージとともによく使用されます.定義は次のとおりです.
  • typedef struct tagTVINSERTSTRUCT {   
        HTREEITEM hParent;      //          
        HTREEITEM hInsertAfter; //                  
    #if (_WIN32_IE >= 0x0400)   
        union  
        {   
            TVITEMEX itemex;   
            TVITEM item;   
        } DUMMYUNIONNAME;   
    #else   
        TVITEM item;            //              
    #endif   
    } TVINSERTSTRUCT, *LPTVINSERTSTRUCT;  
    hParentメンバーがTVI_ROOTまたはNULLの場合、新しいノードはツリーのルートノードとして挿入されます.hInsertAfterは、あるノードのハンドルに加えて、TVI_FIRST(ツリーコントロールの一番前に挿入)、TVI_LAST(ツリーコントロールの一番後ろに挿入)、TVI_ROOT(ルートノードとして挿入)、TVI_SORT(アルファベット順に挿入)の4つの値をとることができます.
    3.ツリーコントロールの適用例
    ツリーコントロールのプロパティ:
    TVS_DISABLEDRAGDROP:ツリーコントロールがTVN_BEGINDRAG通知メッセージを送信することを禁止します.すなわち、ドラッグ操作がサポートされていないTVS_EDITLABELS:ユーザーがノードのラベルテキストTVS_HASBEUTTONSを編集できます.「+」または「-」を表示する小さなボックスは、TVS_HASLINESが展開または展開されているかどうかを示します.親ノードと子ノードの間に線を接続し、ツリーの構造TVS_LIをより明確に表示します.NESATROOT:ルートノードで接続TVS_SHOWSEALWAYS:コントロールが入力焦点を失っても、項目の選択状態を表示する
    CTreeCtrlクラスの主要メンバー関数:
       CString GetItemText(HTREEITEM hItem) const;
                         。  hItem  。              。
    
       BOOL SetItemText(HTREEITEM hItem,LPCTSTR lpszItem);
                         。  hItem  ,lpszItem              。
    
       HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const;
                            。  hItem  。              。
    
       HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const;
                            。  hItem  。              。
    
       HTREEITEM GetParentItem(HTREEITEM hItem) const;
                        。  hItem  。          。
    
       HTREEITEM GetRootItem( ) const;
                   。
    
       HTREEITEM GetSelectedItem( ) const;
                      。
    
       BOOL DeleteAllItems( );
                   。       TRUE,    FALSE。
    
       BOOL DeleteItem(HTREEITEM hItem);
                   。  hItem          。       TRUE,    FALSE。
    
       GetEditControl();     //           
    
       HTREEITEM InsertItem(LPCTSTR lpszItem,int nImage,int nSelectedImage,HTREEITEM hParent = TVI_ROOT,HTREEITEM hInsertAfter = TVI_LAST);
                    。  lpszItem               ,  nImage                    ,  nSelectedImage                    ,  hParent            ,  hInsertAfter             ,         hInsertAfter    。
    
       BOOL SelectItem(HTREEITEM hItem);
               。  hItem          。      TRUE,    FALSE。
    
    ツリーコントロールノード情報の変更
    1.Tree Controlコントロールを追加します.IDはIDC_WEB_TREEに設定されています.属性Has Buttons、Has Lines、Lines At RootはいずれもTrueに設定されています.マウスがノードを横切ったときにプロンプトを表示するためにInfo Tip属性をTrueに設定する必要があります.2.ツリーコントロールIDC_WEB_TREEにCTreeCtrlタイプのコントロール変数m_webTreeを追加します.具体的なコードは以下の通りです.
    public:
        CTreeCtrl m_webTree;
        afx_msg void OnBeginlabeleditWebTree(NMHDR *pNMHDR, LRESULT *pResult);
        afx_msg void OnEndlabeleditWebTree(NMHDR *pNMHDR, LRESULT *pResult);
        afx_msg void OnBnClickedOk();
        afx_msg void OnBnClickedCancel();
        BOOL IsTreeCtrlEditMessage(WPARAM KeyCode);
        HTREEITEM FindItem(HTREEITEM item,CString strText);
    
        CString g_sSelectStr;
       :
    BOOL Ctree_controlDlg::OnInitDialog()
    {
        CDialogEx::OnInitDialog();
    
        //  “  ...”           。
    
        // IDM_ABOUTBOX           。
        ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
        ASSERT(IDM_ABOUTBOX < 0xF000);
    
        CMenu* pSysMenu = GetSystemMenu(FALSE);
        if (pSysMenu != NULL)
        {
            BOOL bNameValid;
            CString strAboutMenu;
            bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
            ASSERT(bNameValid);
            if (!strAboutMenu.IsEmpty())
            {
                pSysMenu->AppendMenu(MF_SEPARATOR);
                pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
            }
        }
    
        //          。              ,     
        //       
        SetIcon(m_hIcon, TRUE);         //      
        SetIcon(m_hIcon, FALSE);        //      
    
    
        //m_imageList.Create(16, 16, ILC_COLOR, 2, 2);                      //      
        //CBitmap bm;
        //bm.LoadBitmap(IDB_BITMAP1);                                   //  Bitmap  
        //m_imageList.Add(&bm, RGB(0, 0, 0));                           //       
        //bm.DeleteObject();
        //bm.LoadBitmap(IDB_BITMAP2);
        //m_imageList.Add(&bm, RGB(0, 0, 0));
    
        //m_ctlTree.SetImageList(&m_imageList,TVSIL_NORMAL); //           
    
        HTREEITEM hroot=m_webTree.InsertItem("csdn  ",1,0,TVI_ROOT);//      
        HTREEITEM h1=m_webTree.InsertItem("    ",1,0,hroot);//      
        HTREEITEM h2=m_webTree.InsertItem("WEB  ",1,0,hroot);//      
        HTREEITEM h3=m_webTree.InsertItem("   ",1,0,hroot);//      
        HTREEITEM h11=m_webTree.InsertItem("ios",1,0,h1);//      
        HTREEITEM h12=m_webTree.InsertItem("android",1,0,h1);//      
        HTREEITEM h13=m_webTree.InsertItem("HTML",1,0,h2);//      
        HTREEITEM h21=m_webTree.InsertItem("CSS",1,0,h2);//      
        HTREEITEM h22=m_webTree.InsertItem("JavaScript",1,0,h2);//          
    
        m_webTree.SetBkColor(RGB(200,200,255)); //          
        m_webTree.SetTextColor(RGB(127,0,0));   //      
        m_webTree.Select(h11,TVGN_CARET);       //  h11    
        // TODO:             
    
        return TRUE;  //           ,     TRUE
    }
    
    void Ctree_controlDlg::OnBeginlabeleditWebTree(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(pNMHDR);
        // TODO:               
        m_webTree.GetEditControl()->LimitText(1024);  
        g_sSelectStr = m_webTree.GetItemText(m_webTree.GetSelectedItem());//        
        *pResult = 0;
    }
    void Ctree_controlDlg::OnEndlabeleditWebTree(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(pNMHDR);
        // TODO:               
    
        //HTREEITEM m_hInsertItem;  
        CString strName;     //        
        CString rootstr;
        m_webTree.GetEditControl()->GetWindowText(strName);  
    
        if (strName.IsEmpty())  
        {  
            MessageBox("         ,     !");  
            return;  
        }  
        if (strName == g_sSelectStr)  
        {  
            return;  
        }  
        HTREEITEM hRoot = m_webTree.GetRootItem();  
        //rootstr = m_webTree.GetItemText(hRoot);  
    
        HTREEITEM hFind = FindItem(hRoot,strName);           
        if (hFind == NULL)  //                
        {  
            char msg[64]={0};  
            sprintf(msg,"     %s,   ?",strName);  
            if (MessageBox(msg,"  ",MB_OKCANCEL) == IDOK)  
            {  
                CString strText;  
                m_webTree.GetEditControl()->GetWindowText(strText.GetBuffer(200),200);  
                m_webTree.SetItemText(m_webTree.GetSelectedItem(),strText);//             
                *pResult = TRUE;  
    
            }  
            else  //    
            {  
                return;
                //m_webTree.DeleteItem(m_hInsertItem); 
            }  
        }  
        else //
        {  
                MessageBox("      ");  
                return;
                //CEdit *pEdit = m_webTree.EditLabel(m_hInsertItem);      
        }  
    
        *pResult = 0;
    }
    BOOL Ctree_controlDlg::IsTreeCtrlEditMessage(WPARAM KeyCode)   
    {   
        BOOL rvalue = FALSE;   
        CWnd *pWnd = this;   
        CTreeCtrl *treectrl = (CTreeCtrl *)pWnd->GetDlgItem(IDC_WEB_TREE);   
        if(!treectrl)  //       
        {  
            return rvalue;   
        }  
        CWnd* focus = GetFocus();  
        CEdit* edit = treectrl->GetEditControl();   
        if((CEdit *)focus == edit)   
        {  
            if (KeyCode == VK_ESCAPE)    
            {  
                edit->SendMessage(WM_UNDO,KeyCode);  //ESC     
            }  
            if (KeyCode == VK_RETURN)  
            {  
                edit->SendMessage(WM_KEYDOWN,KeyCode);   //       
            }  
            rvalue = TRUE;   
        }   
        return rvalue;  
    } 
    
    void Ctree_controlDlg::OnBnClickedOk()
    {
        // TODO:               
        if(!IsTreeCtrlEditMessage(VK_RETURN))   
        {  
            EndDialog(IDOK);   
        }  
    }
    
    
    void Ctree_controlDlg::OnBnClickedCancel()
    {
        // TODO:               
        if(!IsTreeCtrlEditMessage(VK_ESCAPE))   
        {  
            EndDialog(IDCANCEL);   
        }  
    }
    
    
    HTREEITEM Ctree_controlDlg::FindItem(HTREEITEM item,CString strText)  
    {  
        HTREEITEM hFind;  
        if (item==NULL)  //   ,          
        {  
            return NULL;      
        }  
        while(item!=NULL)  //    ,
        {  
            if (m_webTree.GetItemText(item)==strText)  
            {  
                return item;  //
            }  
            if (m_webTree.ItemHasChildren(item))  
            {  
                item = m_webTree.GetChildItem(item);  
                hFind = FindItem(item,strText);  
                if (hFind)  
                {  
                    return hFind;  
                }  
                else  
                {  
                    item = m_webTree.GetNextSiblingItem(m_webTree.GetParentItem(item));  //        
                }  
    
            }  
            else  
            {  
               item = m_webTree.GetNextSiblingItem(item);
                /* if (item == NULL)  
                {  
                    return NULL;  
                } */ 
               return FindItem(item,strText); 
    
            }  
        }  
        return item;  
    }   
    
    void Ctree_controlDlg::OnRclickWebTree(NMHDR *pNMHDR, LRESULT *pResult)
    {
        // TODO:               
        *pResult = 0;
    }
    
    ####         
    1、   ,       ,            :         ,    “MyTree.rc”->"    ",    “Menu”,    。       ID IDR_MENU1,                   ID.
    2、        ,            “    ”,“    ”.
    3、        。     ,                        : NM_RCLICK
    
    void Ctree_controlDlg::OnRclickWebTree(NMHDR *pNMHDR, LRESULT *pResult)
    {
        // TODO:               
           //         ,    menu
            CPoint ScreenPt;
            GetCursorPos(&ScreenPt);
    
            //             
            m_CurTree = m_webTree.GetSelectedItem();
            if (m_CurTree != NULL)
            {
                    //m_webTree.SelectItem(m_CurTree); //            
                    CMenu menu;
                    menu.LoadMenu(IDR_MENU1);
                    CMenu* pPopup = menu.GetSubMenu(0);//        ,         
                    pPopup->TrackPopupMenu(TPM_LEFTALIGN, ScreenPt.x, ScreenPt.y, this);//    
            }
            *pResult = 0;
    }
    
    void Ctree_controlDlg::Onaddnode()
    {
        // TODO:             
        // HTREEITEM hCurrSel = GetSelectedItem();//        
        //MessageBox("tianjiajiedian"); 
         UpdateData(FALSE);
         CString m_stredit=" ";
         HTREEITEM hNew=m_webTree.InsertItem(m_stredit,0,0,m_webTree.GetSelectedItem());
         UpdateData(TRUE);
    }
    
    
    void Ctree_controlDlg::Ondeletenode()
    {
        // TODO:             
        m_webTree.DeleteItem(m_webTree.GetSelectedItem());//       
    
    }
    参考:1.http://www.jizhuomi.com/software/200.html 2.http://blog.csdn.net/lxh1230119/article/details/7756372 3.http://blog.sina.com.cn/s/blog_7f66d4ea0100sie7.html