效果描述:该功能可使某义节点下的全部子节点按某种序列重新排列SortChildren是为该结点下面的所有子节点排序,注意只是子节点,不包括子节点的子节点。
SortChildrenCB是自定义排序方式。现给出大体例子
SortChildrenCB中的TVSORTCB需要用到一个回调函数常常是难点。
INT CHvrTree::SortItem(HTREEITEM hItem)
{
BOOL bRet;
CHvrTree *ptree = this;
TVSORTCB sortpage;
g_pLogger->Debug("<%s(%d)> SortItem(): Enter",D_PC_LOG_NAME_HVRTREE, __LINE__);
//////////////////////////////////////////////////////////////////////////
// ソーティング情報
g_pLogger->Info("<%s(%d)> SortItem(): ソーティングノード,hItem - %08x"
,D_PC_LOG_NAME_HVRTREE, __LINE__,hItem );
sortpage.hParent = hItem;
sortpage.lpfnCompare = MyCompareProc;
sortpage.lParam = (LPARAM)ptree;
bRet = SortChildrenCB(&sortpage);
if ( bRet )
{
g_pLogger->Debug("<%s(%d)> SortItem(): Leave",D_PC_LOG_NAME_HVRTREE, __LINE__);
return D_PC_SUCCESS;
}
else
{
g_pLogger->Debug("<%s(%d)> SortItem(): Leave",D_PC_LOG_NAME_HVRTREE, __LINE__);
return D_PC_FAILURE;
}
}
入口参数是两个在要排序的序列中的无序参数
INT CALLBACK CHvrTree::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CHvrTree* pTreeCtrl = (CHvrTree*) lParamSort;
HTREEITEM hItem1 = (HTREEITEM)lParam1;
HTREEITEM hItem2 = (HTREEITEM)lParam2;
// ノードのアイコンに付けられた固有の番号によって、ノードタイプ取得
INT nKind1 = pTreeCtrl->GetItemType(hItem1);
INT nKind2 = pTreeCtrl->GetItemType(hItem2);
// 1.01 : カテゴリソーティングを機能修正
//////////////////////////////////////////////////////////////////////////
// ノードタイプ取得チェック
if ( (nKind1<0)||(nKind2<0) )
{
g_pLogger->Error( "<%s(%d)> MyCompareProc: 目標ノードノードタイプ情報取得できない, nType - %d",
D_PC_LOG_NAME_HVRTREE, __LINE__, D_PC_FAILURE );
return D_PC_ERRCODE_HVRTREE_GETTREE_FAIL;
}
// 1.01 - END
// ノード情報取得
BOOL bRet;
ST_TREE_NODE *pnodeInfo1 = NULL; // ノード1の情報
ST_TREE_NODE *pnodeInfo2 = NULL; // ノード2の情報
bRet = pTreeCtrl->m_mapNode.Lookup(hItem1,(void*&)pnodeInfo1); // ノード1の情報取得
if(bRet == FALSE)
{
// 目標ノード情報取得できない
g_pLogger->Error( "<%s(%d)> MyCompareProc: 目標ノード情報取得できない, hItem - %08x",
D_PC_LOG_NAME_HVRTREE, __LINE__, hItem1 );
return D_PC_ERRCODE_HVRTREE_GETTREE_FAIL;
}
bRet = pTreeCtrl->m_mapNode.Lookup(hItem2,(void*&)pnodeInfo2); // ノード2の情報取得
if(bRet == FALSE)
{
// 目標ノード情報取得できない
g_pLogger->Error( "<%s(%d)> MyCompareProc: 目標ノード情報取得できない, hItem - %08x",
D_PC_LOG_NAME_HVRTREE, __LINE__, hItem2 );
return D_PC_ERRCODE_HVRTREE_GETTREE_FAIL;
}
INT nRet = NULL; // 戻り値
if( nKind1 == nKind2)
{
// ノード1とノード2は同じノードタイプの場合
// ノード1とノード2はカテゴリーノードの場合
if( nKind1 == D_PC_NODE_CATE_1)
{
CString strItem1,strItem2;
// カテゴリー名取得
strItem1 = pTreeCtrl->GetItemText(hItem1);
strItem2 = pTreeCtrl->GetItemText(hItem2);
// カテゴリー名比較
nRet = strcmp(strItem1, strItem2);
}
// 1.01 : カテゴリソーティングを機能修正
else if( nKind1 == D_PC_NODE_CATE_2)
{
CString strItem1,strItem2;
// カテゴリー名取得
strItem1 = pTreeCtrl->GetItemText(hItem1);
strItem2 = pTreeCtrl->GetItemText(hItem2);
// カテゴリー名比較
nRet = strcmp(strItem1, strItem2);
}
// 1.01 - END
else if( nKind1 == D_PC_NODE_CAM )
{
// ノード1とノード2はカメラノードの場合
// カメラ番号取得
INT nCamId1 = pnodeInfo1->Id;
INT nCamId2 = pnodeInfo2->Id;
// カメラ番号比較
nRet = nCamId1 - nCamId2;
}
else if( nKind1 == D_PC_NODE_HVR )
{
// ノード1とノード2は物件ノードの場合
ST_HVR_INFO hvrInfo1, hvrInfo2;
CString strItem1, strItem2;
// 物件番号取得
INT nHvrId1 = pnodeInfo1->Id;
INT nHvrId2 = pnodeInfo2->Id;
&nb