2011-12-09 21 views
3

私は、WinAPIを使用してTreeViewシステムで作業しています。私は新しい項目を挿入したり、項目を削除したり、コントロール内の項目を移動させたりするいくつかの関数のラッパーを構築しました。しかし、動きのあるアイテムは、お尻の本当の痛みのようです。私は私の問題を解決できるMSDN(http://msdn.microsoft.com/en-us/library/aa925848.aspx)の機能を見つけることができませんでした。Windowsのツリービュー項目を移動する


したがって、私は、アイテムの属性を保存し、古い項目を削除し、新しい場所にアイテムを挿入ダーティハックを作成する必要がありました。少しコードスニペットがあります:

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_DeleteItem(mytreeview, olditem); 

明らかに、これはかなり汚れています。必要な機能を実現する他の可能性はありますか?私はPelles C for Windows(http://www.smorgasbordet.com/pellesc/)でのみ純粋なWinAPIを使用しているので、ライブラリはオプションではありません。


さらに、すべての子供と子供の子供も移動できるようにする方法について考える必要がありました。各アイテムは構造(HTREEITEMハンドル内)に保存されます。

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

特に情報を提供します(ParentID)。私はすべてのアイテム(動的に割り当てられた成長アレイにすべて保存されている)をループし、そのParentIDがアイテム深度の最後のレベルに達するまで移動しなければならないノードの1つと一致するかどうかを確認できますが、もちろん良いでしょう。

私の質問が分かりやすいことを願っています。TreeViewでアイテムを移動する方法が必要です。また、子供と子供の子供も移動させるのが望ましいです(...)。


編集:はところで、私はこの問題を解決する多くのものを見つけましたが、残念ながら唯一のC#、VBなど。で

+2

これは私の理解です。移動モードでは、削除と読み取りが必要です。あなたはおそらく個々のメンバーよりむしろtvitem構造を保つことができます。 – Deanna

+1

これに対して適切なネイティブ実装が見つからない場合は、.NETのソリューションを出発点として使用できます。 .NET Frameworkでは、深いところでWin32 APIを使用し、.NET DLLのソースコードは、たとえばTelerikのJustDecompile(無料)を使用して調べることができます。したがって、私は次のことを行います:(1)この問題( - > Google、MSDN:System.Windows.Forms名前空間、TreeViewクラス)の標準C#ソリューションを見つけ、(2)このC#コードのすべてのステップの実装を調べるJustDecompileを使用している.NET DLLで。 – kol

答えて

3

ツリービューコモンコントロールは、新しい親にアイテムを移動することはできません。 。あなたの兄弟を基準にしてアイテムを移動する場合(ただし同じ親の下にある場合)は、TreeView_SortChildrenCBを使用して、子の順序をカスタマイズするカスタムソート関数を渡すことができます。

関連する問題