2011-12-09 70 views
3

我一直在使用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等。

+2

這是我的理解。移動模式需要刪除和讀取。儘管你可以保留電視結構而不是個人成員。 – Deanna

+1

如果您無法找到適當的本機實現,則可以使用.NET中的解決方案作爲起點。 .NET Framework在深層中使用Win32 API,並且可以使用Telerik的JustDecompile(它是免費的)來檢查.NET DLL的源代碼。所以我會做以下幾點:(1)找到這個問題的標準C#解決方案( - > Google,MSDN:System.Windows.Forms命名空間,TreeView類),以及(2)研究此C#代碼每一步的實現在使用JustDecompile的.NET DLL中。 – kol

回答

3

TreeView的共同控制不支持移動資料轉移到新的父。如果您想要將項目相對於其兄弟(但仍保留在同一父項下)移動,則可以使用TreeView_SortChildrenCB並傳遞一個自定義排序函數,以便按照您的要求對子項進行排序。