Иллюстрированный самоучитель по Visual Studio.Net


Реакция на уведомляющие сообщения CTreeCtrl - часть 2


Первое сообщение (=TVN_ITEMEXPANDING) поступает в момент нажатия маркера (+). Дерево в этот момент еще не раскрылось. Здесь мы должны притормозить процесс перерисовки дерева до того момента, пока не получена вся информация о содержимом раскрываемого узла.

Саму информацию мы будем добывать в теле функции, обрабатывающей второе сообщение (=TVN_ITEMEXPANDED). Оно приходит после того, как узел дерева раскрылся (но не обязательно перерисовался). Здесь мы должны реализовать два варианта развития событий: узел открывается впервые и узел открывается повторно.

Третье сообщение (=TVN_SELCHANGED) приходит в момент, когда пользователь нажал кнопку в пределах самого узла, то есть он выбрал (select) узел. Начнем с обработки первого сообщения. Измените тело функции Onltemexpanding так, чтобы оно имело вид:

void CLeftView::0nltemexpanding (NMHDR* pNMHDR, LRESULT* pResult)

{

//====== Преобразование типа указателя

NM_TREEVIEW* p = (NM_TREEVIEW*)pNMHDR;

//====== Если узел не раскрыт

if ( !(p->itemNew.state & TVIS_EXPANDED))

//====== тормозим перерисовку

SetRedraw(FALSE); *pResult = 0;

}

Бит состояния TVIS_EXPANDED не равен нулю, когда узел уже раскрыт. Мы хотим выделить обратный случай, поэтому пользуемся операцией логического отрицания. Метод cwnd:: SetRedraw позволяет установить флаг перерисовки. Если он снят, то система не будет перерисовывать содержимое окна. Вставьте изменения В тело функции обработки Onltemexpanded:

void CLeftView::OnItemexpanded (NMHDR* pNMHDR, LRESULT* pResult) {

NMJTREEVIEW* p = (NMJTREEVIEW*)pNMHDR;

//====== Создаем курсор ожидания

CWaitCursor wait;

//====== Признак раскрытия узла (а не его закрытия)

if (p->itemNew.state & TVIS_EXPANDED)

{

// Описатели раскрываемого и 1-го вложенного узла

HTREEITEM hCur = p->itemNew.hltem,

h = m_Tree.GetChildItem(hCur);

//====== Если имя вложенного узла пусто,

//====== то ветвь еще не раскрывалась

if (m_Tree.GetItemText(h) == "")

{

//====== Удаляем муляж



Начало  Назад  Вперед