c - Flytter TreeView-elementer i Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har arbejdet på et TreeView-system ved hjælp af WinAPI. Jeg byggede wrappers omkring nogle funktioner, som tillader mig at indsætte nye elementer, fjerne elementer og flytte elementer i en kontrol. Men bevægelige genstande synes at være en reel smerte i rækken. Jeg kunne ikke finde nogen funktion i MSDN (http://msdn.microsoft.com/en-us/library/aa925848.aspx), der kunne løse mit problem. [6]





Derfor var jeg nødt til at oprette en beskidt hack, der gemmer attributterne for et element, sletter det gamle element og indsætter varen på det nye sted. Her er en lille kodestykke:


TVITEM tvitem;
char chrTextBuffer[33];

tvitem.mask = TVIF\_TEXT;
tvitem.cchTextMax = sizeof(chrTextBuffer); //  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 strukt bruges til at hente oplysninger om varen. Jeg vil ikke forklare disse strukturer i detaljer, fordi det ikke er vigtigt lige nu. Nå bliver disse oplysninger nu indsat i en TV\_INSERTSTRUCT og sendt til TreeView via


TreeView\_Insert(mytreeview, &insertstruct);


Det gamle element bliver slettet:


TreeView\_DeleteItem(mytreeview, olditem);





Det er klart, at dette er ret beskidt. Er der nogen anden mulighed for at opnå den ønskede funktionalitet? Jeg bruger kun ren WinAPI i Pelles C til Windows (http://www.smorgasbordet.com/pellesc/), så biblioteker er ingen mulighed. [7]





Desuden var jeg nødt til at tænke på en måde, der gør det muligt at flytte alle børnene og børnenes børn også. Hvert element gemmes i en struktur (i HTREEITEM Handle)


struct cTreeItem
{
    uint8 Type;
    uint8 Used;
    uint16 Depth;
    int32 ParentID;
    HTREEITEM Handle;
};


som giver information, især ParentID. Jeg kunne bare gå gennem alle mine elementer (som alle er gemt i et dynamisk tildelt voksende array) og kontrollere, om deres ParentID matcher en af ​​de noder, der skal flyttes, indtil jeg når det sidste niveau af elementdybde, men et alternativ ville være bedre selvfølgelig.


Jeg håber, at mine spørgsmål er forståelige, jeg har brug for en måde at flytte elementer i en TreeView, helst også flytte deres børn og børns børn (...).





 Btw, jeg fandt en masse ting at løse dette problem, men desværre kun i C #, VB osv.

Bedste reference


Den TreeView fælles kontrol understøtter ikke at flytte elementer til en ny forælder. Hvis du vil flytte et emne i forhold til sine søskende (men forbliver under samme forælder), kan du bruge TreeView\_SortChildrenCB og sende en tilpasset sorteringsfunktion, der ordner børnene, som du vil have.