если я правильно понял, вам надо получить сообщение, когда юзер меняет состояние checked/unchecked. стандартных средств для этого нету (если конечно вы не собираетесь писать только под Vista, там такое есть). решить можно так:
| Код | //объявляем структуру struct ITEMDATA { ITEMDATA(LPCTSTR txt, bool chk) : text(txt), checked(chk) {}; LPCTSTR text; bool checked; };
//добавление итемов нужно будет осуществлять таким способом: TVINSERTSTRUCT tvi; tvi.hParent = TVI_ROOT; tvi.hInsertAfter = NULL; tvi.item.mask = TVIF_TEXT | TVIF_PARAM; tvi.item.pszText = LPSTR_TEXTCALLBACK; tvi.item.lParam = reinterpret_cast<LPARAM>(new ITEMDATA(_T("123"), false)); tree.InsertItem(&tvi); tvi.item.lParam = reinterpret_cast<LPARAM>(new ITEMDATA(_T("345"), false)); tree.InsertItem(&tvi); tvi.item.lParam = reinterpret_cast<LPARAM>(new ITEMDATA(_T("567"), false)); tree.InsertItem(&tvi);
//ловим сообщение TVN_GETDISPINFO от CTreeCtrl ON_NOTIFY(TVN_GETDISPINFO, IDC_TREE1, &CtestDlg::OnTvnGetdispinfoTree1)
void CtestDlg::OnTvnGetdispinfoTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR); if (pTVDispInfo->item.mask & TVIF_TEXT) { ITEMDATA* data = reinterpret_cast<ITEMDATA*>(tree.GetItemData(pTVDispInfo->item.hItem)); bool check = !!tree.GetCheck(pTVDispInfo->item.hItem); pTVDispInfo->item.pszText = const_cast<LPTSTR>(data->text); if (check != data->checked) { data->checked = check; //вот тут можно вставлять свой код, который должен реагировать на изменение состояние checked/unchecked } } // TODO: Add your control notification handler code here *pResult = 0; }
//ловим сообщение TVN_DELETEITEM, чтобы почистить за собой ON_NOTIFY(TVN_DELETEITEM, IDC_TREE1, &CtestDlg::OnTvnDeleteitemTree1) void CtestDlg::OnTvnDeleteitemTree1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); ITEMDATA* data = reinterpret_cast<ITEMDATA*>(tree.GetItemData(pNMTreeView->itemOld.hItem)); delete data; *pResult = 0; }
|
|