WinXP VS2005 MFC SDI
こんにちは。
早速ですが質問させてください
CTreeViewの派生クラスのツリーコントロールの
アイテムを移動する関数を自作したのですが、
移動したアイテムが消えてしまうという現象に困っています。
ツリービューにはラインとアイコンと+-を表示しています。
必ず消えるというわけではなく
あるパターンがあるようなのですが、はっきりとはしません。
1.-+が付いていないアイテムに移動すると消えやすい。
2.A---B---CーーーD
|
E--F
DをFに移動すると消えやすい。
ABCだと多分消えない
じっさいはD&Dのあとの関数呼び出しで
OnUpLMouseで呼び出しています。
デバッガで追っても、下の関数が
エラーて処理抜けすることはありません。
InsertItemも成功しています。
よろしくお願いします。
HTREEITEM CMyTreeView::MoveTreeItem(HTREEITEM hThisItem, HTREEITEM hToItem)
{
if( !hThisItem || !hToItem )
{
return NULL;
}
//Docの取得
CMyDoc* pDoc = dynamic_cast<CMyDoc*>( this->GetDocument() );
if (!pDoc){ return NULL;}
CTreeCtrl* pTree = &this->GetTreeCtrl();
if( pTree )
{
TCHAR szBuffer[ STRING_LENGTH ];
TVITEM item;
item.hItem = hThisItem;
item.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_PARAM|TVIF_STATE
|TVIF_HANDLE|TVIF_SELECTEDIMAGE|TVIF_CHILDREN;
item.pszText = szBuffer;
item.cchTextMax = STRING_LENGTH;//4096
//アイテム情報取得
if( !pTree->GetItem( &item ) ){ return NULL; }
//アイテムのコピー
TVINSERTSTRUCT insertItem;
insertItem.hParent = hToItem;
insertItem.hInsertAfter = TVI_LAST;
memcpy_s( &insertItem.item, sizeof(TVITEM), &item, sizeof(TVITEM) );
const HTREEITEM hNewItem = pTree->InsertItem( &insertItem );
if( !hNewItem ){ return NULL; }
if( 1 )
{
//コピー元削除
pTree->DeleteItem( hThisItem );
//コピー先選択
pTree->SelectItem( hNewItem );
return hNewItem;
}
else
{
pTree->DeleteItem( hNewItem );
}
}
return NULL;
}
hThisItemとhNewItemが同じものを指しているようなケースは無いですか?
書いてある内容を見るだけだとそのくらいしか思いつきませんけれど。
なぜそうなるのかまでは色々調べてみないと解りませんけれど。
PATIOさん
返信ありがとうございます。
if( hThisItem == hToItem )
{
afxMessage...
}
を加えても引っかかりませんでした。
とりあえず、GetItemで取れている値は正常なので、
InsertItemの関数を「文字,親,アイコン」系に変えて
SetStateで値をコピーする方法に変えることで
正常に動作しました。
他は変えていないので
TVINSERTSTRUCTの扱いが間違っているのでしょうけど、
原因はわかりません。
目を通していただきありがとうございました。