我一直在使用WinAPI處理TreeView系統。我圍繞一些函數構建了包裝器,這些函數允許我插入新物品,移除物品並在控件中移動物品。然而,移動物品似乎是屁股真正的痛苦。我無法在MSDN(http://msdn.microsoft.com/en-us/library/aa925848.aspx)中找到任何可以解決我的問題的功能。在Windows中移動TreeView項目
因此,我不得不創建一個髒黑客節省項目的屬性,刪除舊的項目,並在新的位置插入項目。以下是一段代碼片段:
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結構用於檢索有關該項目的信息。我不會詳細解釋這些結構,因爲現在並不重要。那麼,這些信息現在正在通過
TreeView_Insert(mytreeview, &insertstruct);
插入TV_INSERTSTRUCT和發送到TreeView舊的項目被刪除:
TreeView_DeleteItem(mytreeview, olditem);
顯然,這是非常髒。是否有其他可能性來實現所需的功能?我只在Windows的Pelles C中使用純WinAPI(http://www.smorgasbordet.com/pellesc/),所以庫是沒有選擇的。
此外,我不得不考慮一種方法,可以讓所有的孩子和孩子的孩子。每個項目被保存在一個結構(在HTREEITEM手柄)
struct cTreeItem
{
uint8 Type;
uint8 Used;
uint16 Depth;
int32 ParentID;
HTREEITEM Handle;
};
,其提供的信息,特別是PARENTID。我可以遍歷所有項目(全部保存在動態分配的增長陣列中),並檢查它們的ParentID是否與必須移動的節點之一相匹配,直到達到項目深度的最後一個級別爲止,但本機替代當然會更好。
我希望我的問題是可以理解的,我需要一種方法來移動TreeView中的項目,最好也移動他們的子項目和子項目(...)。
編輯:順便說一句,我發現了很多的東西,解決這個問題,但遺憾的是隻在C#,VB等。
這是我的理解。移動模式需要刪除和讀取。儘管你可以保留電視結構而不是個人成員。 – Deanna
如果您無法找到適當的本機實現,則可以使用.NET中的解決方案作爲起點。 .NET Framework在深層中使用Win32 API,並且可以使用Telerik的JustDecompile(它是免費的)來檢查.NET DLL的源代碼。所以我會做以下幾點:(1)找到這個問題的標準C#解決方案( - > Google,MSDN:System.Windows.Forms命名空間,TreeView類),以及(2)研究此C#代碼每一步的實現在使用JustDecompile的.NET DLL中。 – kol