Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > И снова CTreeCtrl, как узнать радительскою ветвь?


Автор: rokky05 5.4.2008, 19:53
У меня есть ТреКонтрол с чек боксами, есть 6 родительских ветвей котории имеют в себе дочернии, если юзер поставил ЧЕК на доченой ветви как мне узнать имя родителя и имя потомка???...
пишу так:
Код

for (int i = 0; i <iCoutOfTree; i++)
    {
        if(mTreeCopyTo.GetCheck(hDlgs[i]) == true)
        {
            CString str = mTreeCopyTo.GetItemText(hDlgs[i]);
            wchar_t wcSelectFiles[512];
            wstring sSelectedFile;

            _tcscpy(wcSelectFiles,str);
            sSelectedFile = wcSelectFiles;
 
            vCountSelDelFiles.push_back(sSelectedFile);
        } 
    }

Но вилетает когда hDlgs[i] доходит до двух, если кликнуть пару раз игнор то всьоже берьот имя потомка....

Автор: rokky05 6.4.2008, 13:33
Хоршо переформолирую вопрос, У меня есть 2 Родительских ветви котории имеют дочерние:
Код

HTREEITEM htiParent1 = m_checktree.InsertItem("Parent 1", NULL, NULL);
HTREEITEM htiParent2 = m_checktree.InsertItem("Parent 2", NULL, NULL);
m_checktree.InsertItem("Child 1", NULL, NULL, htiParent1);
m_checktree.InsertItem("Child 2", NULL, NULL, htiParent2);
m_checktree.InsertItem("Child 3", NULL, NULL, htiParent2);

Если юзер поставил чек на Child 3, как мне узнать имя етой ветви (тоесть "Child 3")????

Автор: korian 6.4.2008, 15:16
если я правильно понял, вам надо получить сообщение, когда юзер меняет состояние 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;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)