У вас здесь ошибка:
ACCEL accel[1]***; //change to accel[2]
accel[0].fVirt = FCONTROL | FVIRTKEY;
accel[0].key = 'R';
accel[0].cmd = IDM_REGENERATETREE;
accel[1].fVirt = FCONTROL | FVIRTKEY;
accel[1].key = 'S';
accel[1].cmd = IDM_SELECTRANDOM;
HACCEL haccel = CreateAcceleratorTable(accel, 2);
Проблемы с отображением возникают при попытке сохранить предыдущее состояние элемента. Нет проблем с отображением, если вы удалите previousStates
из addTreeItem
. Чтобы правильно сохранить состояние, вам может понадобиться std::map и некоторая идентификация пользователя для каждого элемента дерева. По крайней мере, вы должны использовать std::vector, чтобы вам было легче следовать.
Для улучшения визуальных эффектов вы можете добавить TVS_LINESATROOT
в TreeView и WS_CLIPCHILDREN
в главное окно.
Редактировать:
Сохранение предыдущих состояний элемента не должно выполняться в addTreeItem
. Например, новый элемент, который был только что вставлен, еще не будет иметь дочерних элементов, поэтому его нельзя расширить. Упростите addTreeItem
следующим образом:
HTREEITEM addTreeItem(HWND htree, HTREEITEM par, HTREEITEM after, LPCTSTR str, LPARAM lp)
{
TVINSERTSTRUCT tvins;
tvins.hParent = par;
tvins.hInsertAfter = after;
tvins.itemex.mask = TVIF_TEXT | TVIF_PARAM;
tvins.itemex.pszText = const_cast<LPTSTR>(str);
tvins.itemex.lParam = lp;
HTREEITEM node = TreeView_InsertItem(htree, &tvins);
return node;
}
Чтобы сохранить предыдущее состояние элемента, каждый элемент должен иметь свой идентификатор. Поскольку в этом примере имя элемента отличается для каждого узла, мы можем использовать его для карты. Но если бы это была структура каталогов, она бы не работала, мы должны использовать полный путь вместо имени узла.
void RootWindow::RegenerateTree()
{
if (!m_hwndTreeView) return;
if (!IsWindow(m_hwndTreeView)) return;
HWND hwnd = m_hwndTreeView;
//this will stop treeview from updating after every insert
SetWindowRedraw(hwnd, 0);
std::map<std::wstring, UINT> state;
const int maxtext = 260;
wchar_t buf[maxtext];
std::wstring selection;
UINT count = TreeView_GetCount(hwnd);
if (count)
{
for (HTREEITEM item = TreeView_GetRoot(hwnd); item; item = nextItem(hwnd, item))
{
TVITEM tv{ 0 };
tv.mask = TVIF_TEXT | TVIF_STATE;
tv.stateMask = TVIF_TEXT | TVIF_STATE;
tv.cchTextMax = maxtext;
tv.pszText = buf;
tv.hItem = item;
if (TreeView_GetItem(hwnd, &tv))
state[buf] = TreeView_GetItemState(hwnd, item,
TVIS_SELECTED | TVIS_EXPANDED);
}
}
TreeView_DeleteAllItems(hwnd);
addTreeItem...
addTreeItem...
addTreeItem...
//restore previous item state here:
if (count)
{
for (HTREEITEM item = TreeView_GetRoot(hwnd); item; item = nextItem(hwnd, item))
{
TVITEM tvitem{ 0 };
tvitem.hItem = item;
tvitem.mask = TVIF_TEXT;
tvitem.cchTextMax = maxtext;
tvitem.pszText = buf;
if (TreeView_GetItem(hwnd, &tvitem))
TreeView_SetItemState(hwnd, item, state[buf],
TVIS_SELECTED | TVIS_EXPANDED);
}
}
SetWindowRedraw(hwnd, 1);
}
person
Barmak Shemirani
schedule
13.05.2015