Будем дальше развивать наш проект. Нам надо поместить на него элемент дерево просмотра.
Для этого элемента установим свойства. О них по шагам есть дальше, а пока кратко. В свойствах мы настроим, как будут отображаться элементы дерева.
Объявить класс элемента управления.
class CTestDlg : public CDialog // класс диалогового окна
{
public:
CEdit cEdit; //
CTreeCtrl m_Tree; // класс дерева
protected:
CString m_edit; // даные
};
Организовать обмен данными через DDX
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
.............
DDX_Control(pDX, IDC_EDIT3, cEdit); // с окном
DDX_Control(pDX, IDC_TREE1, m_Tree); // с деревом
}
Установка элементов в дерево при инициализации диалогового окна.
BOOL CTestDlg::OnInitDialog()
{
............
cSpin.SetPos(50); // позиция
HTREEITEM otdel=m_Tree.InsertItem("otdel"); // структура элемента дерево
HTREEITEM ayp=m_Tree.InsertItem("ayp",otdel); // структура элемента дерево
HTREEITEM work=m_Tree.InsertItem("working",otdel); // структура элемента дерево
m_Tree.InsertItem("Petrov",ayp); // добавить элемент
m_Tree.InsertItem("Ivanow",ayp); // добавить элемент
m_Tree.InsertItem("Katj",work); // добавить элемент
m_Tree.InsertItem("Olj",work); // добавить элемент
m_Tree.InsertItem("Nastj",work); // добавить элемент
return TRUE;
}
А вот так будет все это работать.
Элемент CTreeCtrl предназначен для работы со структурами, имеющими древовидную структуру. Воющем это является основой всех классификаций. Посмотрите на структуру предприятия: всё предприятие - отделы - отряды - люди. Это дерево. Или Государство. Государство - области - районы - поселки - улицы - дома. Практически все данные можно представить в виде иерархий того или иного плана. Как всегда объявляем класс и устанавливаем связь через DDX - это мы уже делаем, не помню, какой раз. Для заполнения дерева нам необходимо использовать функцию InsertItem у этой функции много описаний и воспользуемся самым простым.
HTREEITEM InsertItem( LPTV_INSERTSTRUCT lpInsertStruct );
HTREEITEM InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, HTREEITEM hParent, HTREEITEM hInsertAfter );
HTREEITEM InsertItem( LPCTSTR lpszItem, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST );
HTREEITEM InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
Как видите в функции выделенной жирным шрифтом обязательным является только один параметр. Это строка. Второй параметр - это адрес ствола дерева. TVI_ROOT - это означает корень, то есть элемент самого верхнего уровня. Итак, при первом вызове функции я создал корень дерева с названием otdel. При выполнении функции возвращается идентификатор этого узла в виде переменной типа HTREEITEM. Мы её запоминаем, чтобы создать узлы меньшего уровня. Посмотрите ниже по коду. Теперь используем эту переменную otdel, для того чтобы вставить два ответвления. И при их вставке запоминают место в переменных, для того чтобы вставить еще узлы меньшего ранга. Запускайте. Вы увидите древовидный список, сможете открывать, закрывать ветви.
Давайте еще раз посмотрим как производилось добавление элементов.
HTREEITEM otdel=m_Tree.InsertItem("otdel");
Добавили в корень дерева пункт otdel. Теперь у нас есть указатель на этот пункт. Мы им воспользуемся для создания подпунктов в пункте.
HTREEITEM ayp=m_Tree.InsertItem("ayp",otdel);
HTREEITEM work=m_Tree.InsertItem("working",otdel);
Теперь у нас три указателя. Используя любой мы можем добавлять элементы дальше.
m_Tree.InsertItem("Petrov",ayp);
Объявить класс
class CTestDlg : public CDialog // класс диалогового окна
{
..........
CTreeCtrl m_Tree; // класс дерева
..........
};
Настроить DDX.
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
.............
DDX_Control(pDX, IDC_TREE1, m_Tree); // с деревом
}
Произвести начальную инициализацию.
.........
HTREEITEM work=m_Tree.InsertItem("working",otdel); // структура элемента дерево
m_Tree.InsertItem("Petrov",ayp); // добавить элемент
........