void ATreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem;
HTREEITEM hParent;
extern int FlagMainTest;
hItem = GetTreeCtrl().GetSelectedItem();
if (hItem == NULL)
{
FlagMainTest = 0;
*pResult = 0;
return;
}
CString ItemText = GetTreeCtrl().GetItemText(hItem);
hParent = GetTreeCtrl().GetParentItem(hItem);
if (hParent == NULL)
{
FlagMainTest = 0;
::PostMessage(this->GetParentFrame()->m_hWnd,WM_SELECTNEWTEST,0,0);
*pResult = 0;
return;
}
CString Parent = GetTreeCtrl().GetItemText(hParent);
if (strcmp(Parent,"Customs")!=0)
{
strcpy(SelChangeParam,ItemText);
FlagMainTest = 1;
::PostMessage(this->GetParentFrame()->m_hWnd,WM_SELECTNEWTEST,0,(LPARAM)SelChangeParam);
}
else
{
strcpy(SelChangeParam,ItemText);
FlagMainTest = 2;
::PostMessage(this->GetParentFrame()->m_hWnd,WM_SELECTNEWTEST,1,(LPARAM)SelChangeParam);
}
*pResult = 0;
}
BEGIN_MESSAGE_MAP(ATreeView, CTreeView)
//{{AFX_MSG_MAP(ATreeView)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_WM_RBUTTONDOWN()
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_COMMAND(ID_111_PROPERTIES, On111Properties)
ON_COMMAND(ID_111_RUNTEST, On111Runtest)
ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, OnEndlabeledit)
ON_COMMAND(ID_111_DELETE, On111Delete)
ON_COMMAND(ID_111_CLEARALLRESULTS, On111Clearallresults)
ON_WM_CHAR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
Писалось на MFC. Обрабатывается сообщение
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
Чтение с контроля показано в функции обработчике.
По адгоритиму - у меня было 2 раздела тестов - внутри которых были списки тестовых процедур - в функции определяется hParent нажатого элемента и если он отсутствует - нажат элемент типа.
Если есть - то определяется имя типа
CString Parent = GetTreeCtrl().GetItemText(hParent);
Далее для привязки к контролю дерева списка - послыается сообщение
::PostMessage(this->GetParentFrame()->m_hWnd,WM_SELECTNEWTEST,0,(LPARAM)SelChangeParam)
Причем посылалось оно у меня не в сам CListCtrl а в папино окошко Main Frame.
Там соответственно обрабатывалось.
Причиной такого действия является достаточно высокая сложность программы и введения для всех операций управдления - которое осуществлял класс окна фреймов...
На экране иногда были: Дерево + Спсиок, Дерево + процессинг тестов, просто управление пинами процессора и т.д. Это тебе не важно, но просто - дабы стало понятно, что это не обязательно.
Данные выводимые в контролях я хранил в ini вайлах.
Отдельно для списка и дерева.
Основной проблемой является то, что ты не можешь просто в качестве параметра передать ItemText так как он локален и его адресс по выходу из функции обработки клика исчезнет.
Надо иметь передаваемую строку, глобального свойства.
strcpy(SelChangeParam,ItemText);