Перемещение элементов TreeView в Windows - PullRequest
3 голосов
/ 09 декабря 2011

Я работал над системой 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 и т.д ..

1 Ответ

3 голосов
/ 09 декабря 2011

Общий элемент управления TreeView не поддерживает перемещение элементов к новому родителю.Если вы хотите переместить элемент относительно его братьев и сестер (но остаться под тем же родителем), вы можете использовать TreeView_SortChildrenCB и передать пользовательскую функцию сортировки, которая упорядочивает дочерние элементы так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...