MFC學習之CTreeCtrl控制項的使用

2021-06-21 20:35:06 字數 2610 閱讀 6475

樹狀控制項ctreectrl主要用於樹狀結構的功能使用,其中樹狀結構有乙個根接點(root),乙個根接點下可以有多個子接點或者不設定子接點,子接點也可以作為父節點,使其下也包含若干的子接點,總是可以根據接點之間的上下級關係然後設定相應的接點。

mtreectrl::insertitem 函式為為控制項新增接點,其結構如下:

htreeitem insertitem(

lptvinsertsruct lpinsertstruct );

htreeitem insertitem(

lpctstr lpszitem,

htreeitem hparent = tvi_root,

htreeitem hinsertafer = tvi_last );

當需要新增乙個接點的時候,做如下操作:

htreeitem htreeitem;

ctreectrl m_treectrl;

htreeitem htreesub;

htreeitem = m_treectrl.insertitem("root");或者htreeitem = m_treectrl.insertitem("root",tvi_root);

如上操作就相當於給乙個樹狀結構新增了乙個根接點。如果還想給該根接點新增乙個子接點的話,則如下操作:

htreeitem = m_treectrl.insertitem("child",htreeitem);

如上,這樣子就建立了乙個root的子接點child,函式insertitem中的htreeitem則為其父接點的控制代碼。

由此可以推理下去,乙個樹結構根接點只有乙個,然後要建立子接點時,只需記住父接點的控制代碼,便可以獲取相應的子接點,

並且在建立多個子接點的時候,可以直接模仿上面的操作,建立的新的接點直接新增到上面的接點後面。

下面貼下自己實現的**,主要是將一些資料存到檔案中,然後讀取出來進行設定樹結構。

filename.txt內容:

name:tom,jony,gray

city:china,enlish,japanese

data:we,fri,sun

inittreectrl()函式

void inittreectrl()

strpath = strpath.left(pos);

strpath.format("%s\\filename.txt",strpath);

std::string strpath1 = cstringa(strpath);

file* pfile = fopen(strpath1.c_str(),"r");

if (pfile == null)

char cdata[256];

memset(cdata,0,256);

fgets(cdata,256,pfile);

while (strcmp(cdata,"")!=0)

cstring strtreename = strdata.left(pos1);

htreesub = m_treectrl.insertitem(strtreename,htreeroot);

strdata = strdata.right(strdata.getlength()-pos1-1);

while ((pos1 = strdata.find(','))!=-1)

if (strdata.getlength()!=0)

}memset(cdata,0,256);

fgets(cdata,256,pfile);

}fclose(pfile);

m_treectrl.expand(htreeroot,tve_expand);//expand展開樹狀結構

其中接點前變成可選的狀態,則是將ctreectrl控制項的屬性中的checks boxs的屬性改為true就可以了。

name前面的加減收縮符號,則是通過將屬性has buttons改為true。

這兩種可以通過相應的語言來設定。

2、當選中父接點時,該父接點下的所有子接點也被選中。

ctreectrl的hittest函式能夠得到與當前滑鼠位置相關的項,所以可以先獲取當前滑鼠的位置,然後根據滑鼠座標獲取該範圍內的接點控制代碼。ctreectrl的getchilditem方法可以獲取當前控制代碼的孩子接點的控制代碼,所以可以根據父子接點的上下級關係實現子接點狀態的修改。首先可以新增ctreectrl物件的nm_click方法。具體實現如下:

void cdialogstudydlg::onnmclicktree1(nmhdr *pnmhdr, lresult *presult)

hlayer1 = m_treectrl.getnextitem( hlayer1 , tvgn_next );//獲取子接點中的下乙個接點的控制代碼}}

}*presult = 0;

}

效果如下:

先寫到這些,後續學到別的繼續新增。

MFC 樹控制項CTreeCtrl

常用屬性設定 屬性 含義 has buttons true 有展開按鈕 has lines true 有展開線 lines at root true 有根節點 常用介面 介面 功能 獲取應用程式物件指標 載入自定義圖示 cimagelist create 建立影象列表 cimagelist add ...

MFC樹控制項CTreeCtrl

屬性 含義 has buttons true 有展開按鈕 has lines true 有展開線 lines at root true 有根節點 介面 功能 獲取應用程式物件指標 載入自定義圖示 cimagelist create 建立影象列表 cimagelist add 影象列表追加圖示 ctr...

學習小結之 MFC

問題1 mfc列表框中內容不按照新增的順序顯示 解決 控制項屬性 行為 sort false l 等於cstring型別的null,不等於一般的null 控制項變數 control 代表這個控制項 value 傳值 獲取列表框當前選項的下標 從0開始 control.getcursel 讀取檔案 c...