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構造体の定義は、 です.ツリーコントロールに新しいノードを挿入するには、TVINSERTSTRUCT構造体を使用する必要があります.TVM_INSERTITEMメッセージとともによく使用されます.定義は次のとおりです.
3.ツリーコントロールの適用例
ツリーコントロールのプロパティ:
TVS_DISABLEDRAGDROP:ツリーコントロールがTVN_BEGINDRAG通知メッセージを送信することを禁止します.すなわち、ドラッグ操作がサポートされていないTVS_EDITLABELS:ユーザーがノードのラベルテキストTVS_HASBEUTTONSを編集できます.「+」または「-」を表示する小さなボックスは、TVS_HASLINESが展開または展開されているかどうかを示します.親ノードと子ノードの間に線を接続し、ツリーの構造TVS_LIをより明確に表示します.NESATROOT:ルートノードで接続TVS_SHOWSEALWAYS:コントロールが入力焦点を失っても、項目の選択状態を表示する
CTreeCtrlクラスの主要メンバー関数:
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を追加します.具体的なコードは以下の通りです.
ツリーコントロールの通知メッセージはたくさんあります.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.ツリーコントロールの関連データ構造
typedef struct tagNMTREEVIEW {
NMHDR hdr; // NMHDR
UINT action; //
TVITEM itemOld; //
TVITEM itemNew; //
POINT ptDrag; //
} NMTREEVIEW, *LPNMTREEVIEW;
TVINSERTSTRUCT構造体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