問題一:
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知道原理的朋友,歡迎留言解釋一下,感恩!
沒有留言:
張貼留言