2013/11/21

[MFC] TreeCtrl使用問題

前提:TreeCtrl需帶有 "Check Boxes"屬性
問題一:
OnInitDialog時,在treectrl內新增item後,需要將此項目的checkbox勾選,但是SetCheck卻無效?
回答一:
若要在初始化時期就設定treectrl's check box狀態,且在UI上表現出來,需在設定check box前,重新設定一次tree ctrl屬性!
若是在OnInitDialog以後的function內設定treectrl's check box,則無此問題。
BOOL TestDlg::OnInitDialog() { CDialog::OnInitDialog(); //TODO: mTreectrl.ModifyStyle( TVS_CHECKBOXES, 0 ); mTreectrl.ModifyStyle( 0, TVS_CHECKBOXES ); //在這之後新增的item就可以設定check box為有勾選狀態 HTREEITEM hCurItem = mTreectrl.InsertItem("Test"); mTreectrl.SetCheck(hCurItem,true); }
問題二:
當勾選/取消溝選Tree上任一Item後,要如何自動選擇目前的Item,而非總是選擇第一個Item?
回答二:
需要在Click事件動手腳!
方法1:
void TestDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此加入控制項告知處理常式程式碼 *pResult = 0; //不正當寫法 //copy from OnTvnSelchangedTree LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); // pNMTreeView->ptDrag; //此point無法直接換算取得目前點擊的Item CPoint pt; pt.x = pNMTreeView->ptDrag.y; // 此point位置無法理解. pt.y = pNMTreeView->itemNew.lParam; // 此point位置無法理解. HTREEITEM hCurItem = mTreectrl.HitTest(pt); if(hCurItem == NULL) return; //CString szText = mTreectrl.GetItemText(hCurItem);//驗證用,非必須. mTreectrl.SelectItem(hCurItem); }
方法2:
void TestDlg::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此加入控制項告知處理常式程式碼 *pResult = 0; //正常寫法 CPoint pt; GetCursorPos(&pt); mTreectrl.ScreenToClient(&pt); HTREEITEM hCurItem = mTreectrl.HitTest(pt); if(hCurItem == NULL) return; //CString szText = mTreectrl.GetItemText(hCurItem);//驗證用,非必須. mTreectrl.SelectItem(hCurItem); }
方法1知道原理的朋友,歡迎留言解釋一下,感恩!