Я работал над системой TreeView с использованием WinAPI.Я построил обертки вокруг некоторых функций, которые позволяют мне вставлять новые элементы, удалять элементы и перемещать элементы в элементе управления.Тем не менее, движущиеся предметы, кажется, настоящая боль в заднице.Я не смог найти ни одной функции в MSDN (http://msdn.microsoft.com/en-us/library/aa925848.aspx), которая могла бы решить мою проблему.
Поэтому мне пришлось создать грязный хак, который сохраняет атрибуты элемента, удаляетстарый элемент и вставляет элемент в новом месте. Вот небольшой фрагмент кода:
TVITEM tvitem;
char chrTextBuffer[33];
tvitem.mask = TVIF_TEXT;
tvitem.cchTextMax = sizeof(chrTextBuffer); // \0 termination included?
tvitem.pszText = chrTextBuffer;
tvitem.hItem = olditem; // different in the original code, don't want to post the entire function
TreeView_GetItem(GUIVars.Controls.GUI_Chat.ChannelTree, &tvitem);
Структура TVITEM используется для получения информации об элементе. Я не буду объяснять эти структуры подробно, потому чтосейчас это не важно. Ну, теперь эта информация вставляется в TV_INSERTSTRUCT и отправляется в TreeView через
TreeView_Insert(mytreeview, &insertstruct);
Старый элемент удаляется:
TreeView_DeleteItem(mytreeview, olditem);
Очевидно, что это довольно грязно. Есть ли какая-либо другая возможность для достижения желаемой функциональности? Я использую только чистый WinAPI в Pelles C для Windows (http://www.smorgasbordet.com/pellesc/),, поэтому библиотеки не вариант.
Кроме того, мне пришлось подумать о способе, который позволяет перемещать всех детей и детей детей. Каждый элемент сохраняется в структуре (в ручке HTREEITEM)
struct cTreeItem
{
uint8 Type;
uint8 Used;
uint16 Depth;
int32 ParentID;
HTREEITEM Handle;
};
, которая предоставляет информацию, особенно ParentID.Я мог бы просто пройтись по всем моим элементам (которые все сохранены в динамически размещенном растущем массиве) и проверить, соответствует ли их ParentID одному из узлов, который должен быть перемещен, пока я не достигну последнего уровня глубины элемента, но нативной альтернативыбыло бы лучше, конечно.
Я надеюсь, что мои вопросы понятны, мне нужен способ перемещения элементов в TreeView, желательно также перемещать их детей и детей (...).
Редактировать: Кстати, я нашел много вещей, решающих эту проблему, но, к сожалению, только в C #, VB и т.д ..