子关键字,是在用户用鼠标单击了+或-按钮或者双击了树项关键字名的操作响应过程中动态完成的。由于树型控制的功能极强,所以几乎没有必要做管理树型控制的工作(例如,视图滚动等),只需编写出响应上述操作的代码就可以了。
VOID CWRegTreeCtrlDlg::OnDblclkTreereg(NMHDR*
pNMHDR, LRESULT* pResult)
{ HTREEITEM hIT =
m_TREECtrlREG.GetSelectedItem( );
if( hCurItem != hIT) { hCurItem = hIT; }
SelectItemTr = m_TREECtrlREG.GetItemText(hIT);
//1.单击了“<我的电脑>顶层”后的处理--交树型控制处理
CString MainName ,strTemp0,strTemp1;
strTemp0.LoadString(IDS_STRINGPROMPT0);
strTemp1.LoadString(IDS_STRINGPROMPT1);
if( hIT == hTreeItem[0])
{//将初值放到其它各个控制中
//路径,顶层句柄初始化
lpRegPath=_T("");
hKeyRoot = 0;
* pResult=0;
return;
}
//2.单击了六个主层关键字名之一后的处理
if( OnIsMianItem(hIT) )
{//主层位置是否改变
if(m_TOPPOSOUT != SelectItemTr)
{m_TOPPOSOUT = _T("");
m_TOPPOSOUT = SelectItemTr;
}
//将初值放到其它各个控制中
//路径,顶层句柄初始化
lpRegPath=_T(""); hKeyRoot = 0;
//新选择的关键字名
m_CURKEYNAME=SelectItemTr;
//调整访问注册库句柄值hKeyRoot
OnMainKeyHandle(hIT,hKeyRoot);
HTREEITEM hChild =
m_TREECtrlREG.GetChildItem(hIT);
//已经展开过,则交树型控制自己反转
if( hChild != NULL )
{ EnumValueName(hKeyRoot);//显示关联值名
* pResult=0;
return ;
}
UpdateData(FALSE);
//没有展开过,则通过访问注册库动态展开子关键字
QueryKeyInfo ( hKeyRoot );
* pResult=0;
return ;
}
//3.子层情况
//3.1 选择的名字是重复选择
if(
SelectItemTr==lpRegPath.Right(SelectItemTr.GetLength( )))
{ * pResult=0; return; }
//3.2 按照选择的关键字名在树上找到它的父关键字的全路径名字(不包含被选择的关键字的名字)。如果不等于lpRegPath,则要修改lpRegPath
CString strParent,strPath;
strParent = SelectItemTr;
//在树上形成该项目的全路径名字,反复往上爬
while( ! OnIsMianItem(hIT) )//是否到达主层位置
{hIT = m_TREECtrlREG.GetParentItem(hIT);
strParent=
(LPCTSTR)m_TREECtrlREG.GetItemText(hIT);
if(OnIsMianItem(hIT) )
{
int pos;
if((pos=strPath.ReverseFind(''\\'')) != -1)
{CString strTemp00;
strTemp00=strPath.Left(strPath.GetLength()-1);
strPath=strTemp00;
break;
}
}
else//左加上路径
{CString strTemp99;
strTemp99.Format(_T("%s\\%s"),strParent,strPath);
strPath=strTemp99;
}
}
//主关键字的位置是否改变
MainName=m_TREECtrlREG.GetItemText(hIT);
if( MainName != m_TOPPOSOUT)
{ m_TOPPOSOUT = _T("");
m_TOPPOSOUT = MainName;
//调整访问注册库句柄值hKeyRoot
OnMainKeyHandle(hIT,hKeyRoot);
}
if( strPath != lpRegPath ) lpRegPath = strPath;
// 将初值放到其它各个控制中
//是否要刷新
HTREEITEM hChild3 = m_TREECtrlREG.GetChildItem( hCurItem );
HTREEITEM hTemp3;
while (hChild3 != NULL)
{ hTemp3 = m_TREECtr