Шаг 175 - Удаление пунктов из дерева и изменение имени

В прошлом шаге мы научились добавлять пункты верхнего уровня к дереву. Теперь нам необходимо научиться их удалять. На панели инструментов у нас есть кнопка удаления, к которой привязана функция реализованная в виде дерева.

175_1.gif (1035 b)

А вот и код для неё в классе вида на основе дерева, но пока пустой.

void CLeftView::OnDeleteDir() 
{
	// TODO: Add your command handler code here
	
}

Первое, что нам надо сделать это определить был ли выделен элемент дерева. Для этого надо воспользоваться методом GetSelectedItem. Этот метод возвращает указатель на структуру типа HTREEITEM или NULL, если не было выделения элемента.

void CLeftView::OnDeleteDir() 
{
HTREEITEM hi;
hi=GetTreeCtrl().GetSelectedItem();  
if (hi!=NULL)
{ 

}
else AfxMessageBox("Not Selected Item");
}

Если элемент получен, то есть ссылка на HTREEITEM, теперь этот элемент можно и удалить.

if (hi!=NULL)
{ 
  GetTreeCtrl().DeleteItem(hi); 
}

Для переименования пункта нам надо сделать новую кнопку на панели инструментов и связать обработку с видом.

175_2.gif (4065 b)

Для начала проверим выделен ли пункт меню.

void CLeftView::OnRanameDir() 
{
HTREEITEM hi;
hi=GetTreeCtrl().GetSelectedItem();  
if (hi!=NULL)
	{ 
  
	}
else AfxMessageBox("Not Selected Item");
}

Теперь можно получить название элемента дерева. Для этого есть метод GetItemText. Вот, например, так.

if (hi!=NULL)
{ 
   AfxMessageBox(GetTreeCtrl().GetItemText(hi));	 
}

Для установки нового текста есть метод SetItemText, вот так им можно воспользоваться.

if (hi!=NULL)
{ 
   AfxMessageBox(GetTreeCtrl().GetItemText(hi));
   GetTreeCtrl().SetItemText(hi,"new");
}

Теперь дело за маленьким. Сделать диалоговое окно, которое позволит править текст. И переименование элемента дерева будет готово. Вот общий код.

if (hi!=NULL)
	{ 
		CDIalogEdit cd(GetTreeCtrl().GetItemText(hi));
		if (cd.DoModal()==IDOK)
		{
	  	   GetTreeCtrl().SetItemText(hi,cd.m_Edit);
		}
	}

Единственное, что мне пришлось создать класс диалога. Дальше на него я поместил строку редактирования и создал в классе диалога элемент данных m_Edit, перегрузил конструктор, чтобы в окне редактирования сразу появлялось то, что и в пункте элемента дерева. Вот конструктор.

CDIalogEdit::CDIalogEdit(CString s,CWnd* pParent /*=NULL*/)
	: CDialog(CDIalogEdit::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDIalogEdit)
	m_Edit = s;
	//}}AFX_DATA_INIT
}

Теперь наше приложение умеет удалять пункты меню и их переименовывать.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 1.05.2000