lREG.GetNextSiblingItem(hChild3);
m_TREECtrlREG.DeleteItem(hChild3);
hChild3 = hTemp3;
}
UpdateData(FALSE);
//展开一层,即在树上插入与显示子层的直接各子层关键字名字
//参数包括:被选择的关键字名字,路径(不包含被选择的关键字名字),六个主关键字句柄之一
RegLevelExpand ( SelectItemTr,lpRegPath, hKeyRoot);
return ;
}
四、对目录或文件的处理
注册库的子关键字的名字是动态插入到树上的,首次插入到树上的关键字的下面是否又有子关键字是不知道的,因此两个像表小位图也不能确定使用哪一个。在这点上,树型控制也无能为力,它只能通过用户指定插入项目的cChildren,iImage和iSelectedImage标志值为I_CHILDRENCALLBACK,而后在需要确定值时,通过控制向父窗口发送通知TVN_GETDISPINFO来取得需要的信息,但是树型控制将+或-按钮一律设置为+按钮,显然目录和文件两种位图都被设置成了可展开的+按钮,使用户感到迷惑,从而失去了直观性(关键字一旦展开过一次以后,树型控制就可以区分它了!)。解决方法如下所述:
在访问注册库时,对展开关键字再进行检测(幸好注册库可以嵌套打开),检测到是否有子关键字后立即返回,从而可以精确地确定+或-按钮以及位图的状态,并且正确地插入到树上,其它情况树型控制均能够自动处理。
//检测函数入口,参数为:路径,六个主关键字句柄之一
DWORD CWRegTreeCtrlDlg::RegLevelPreExpand(const
CString & lpRegSub, HKEY & hPreKey)
{ HKEY hKey; DWORD RetValue,SubKeyNs;
//1.获得路径的句柄
RetValue = (DWORD)RegOpenKeyEx (
(HKEY)hPreKey,LPCTSTR(lpRegSub),0,
(REGSAM) KEY_ENUMERATE_SUB_KEYS|
KEY_EXECUTE ,
(PHKEY)&hKey);//接收返回打开关键字的句柄
//2.打开是否成功检测
//3.询问子关键字数信息
SubKeyNs=QuerySubKeyNums (hKey);
//4.关闭注册库
RegCloseKey (hKey);
return SubKeyNs;
}