LD, ILI_OPENFLD, hParent);
AddDummyNode(hItem);//加入空子树
}
}
2) 发送树型视图消息TVN_ITEMEXPANDING和TVN_SELCHANGING的编写,前者为
列表项被扩展(或收缩),后者为当前的选择项发生变化。
函数体如下:
void CRegLeftView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HKEY hKey;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
if(!IsSubTree(hItem))
{
CString strDataName = GetDataFromItem (hItem);
//返回除去“我的电脑”的项目名,实为键路径
hKey=GetHkey(strDataName);
//返回当前项目名的主键
CString strSubKey;
int i=strDataName.Find("\\");
if(i==-1)
{
strSubKey="";
}else
strSubKey=strDataName.Mid(i+1);
CWaitCursor wait;
if (pNMTreeView->action == TVE_EXPAND)
{
if(strDataName != MYCOMPUTER)
{
DeleteChildren (hItem);
//删除当前项目的所有子树
if (!EnumerateKey(hKey,strSubKey,hItem))
//枚举当前项目的所有子树
*pResult = TRUE;
}
}
}
*pResult = 0;
}
void CRegLeftView::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
if(i!=0)
{
HKEY hKey;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
CString strDataName = GetDataFromItem (hItem);
hKey=GetHkey(strDataName);
CString strSubKey;
int i=strDataName.Find("\\");
if(i==-1)
{
strSubKey="";
}else
strSubKey=strDataName.Mid(i+1);
CWaitCursor wait;
CRegExplorerDoc* pDoc = GetDocument();
pDoc->m_RegExplorerView->DeleteAllItems();
//与文档类通信的代码,并可以操作RegExplorerView
if(strDataName == MYCOMPUTER)
return;
pDoc->m_RegExplorerView->DoListView(hKey,strSubKey);
}
i++;
*pResult = 0;
}
其他函数的实现:
CString CRegLeftView::GetDataFromItem(HTREEITEM hItem)
{
CString str;
while (hItem != NULL)
{
CString string = GetTreeCtrl().GetItemText (hItem);
if ((string.Right (1) != "\\") &;&; !str.IsEmpty ())
string += "\\";
str = string + str;
hItem = GetTreeCtrl().GetParentItem (hItem);
}
//8为我的电脑的长度,为的是去除我的电脑4个字
if(str.Left(8) == MYCOMPUTER &;&; str.GetLength() > 8)
str = str.Mid(9);
return str;
}
HKEY CRegLeftView::GetHkey(LPCTSTR strKey)
{
HKEY hKeyRootName;
CString cstrKeyRootName=strKey;
int i=cstrKeyRootName.Find("\\");
if(i!=-1)
cstrKeyRootName=cstrKeyRootName.Left(i);
if(cstrKeyRootName == _T("HKEY_CLASSES_ROOT"))
hKeyRootName = HKEY_CLASSES_ROOT;
else if(cstrKeyRootName == _T("HKEY_CURRENT_USER"))
hKeyRootName = HKEY_CURRENT_USER;
else if(cstrKeyRootName == _T("HKEY_LOCAL_MACHINE"))
hKeyRootName = HKEY_LOCAL_MACHINE;
else if(cstrKeyRootName == _T("HKEY_USERS"))
hKeyRootName = HKEY_USERS;
else if(cstrKeyRootName == _T("HKEY_PERFORMANCE_DATA"))
hKeyRootName = HKEY_PERFORMANCE_DATA;
else if(cstrKeyRootName == _T("HKEY_CURRENT_CONFIG"))
hKeyRootName = HKEY_CURRENT_CONFIG;
else if(cstrKeyRootName == _T("HKEY_DYN_DATA"))
hKeyRootName = HKEY_DYN_DATA;
return hKeyRootName;
}
/*一层树算法:对注册表树的当前一层进行枚举*/
UINT CRegLeftView::EnumerateKey(HKEY hKey, LPCTSTR strKey, HTREEITEM hItem)
{
HTREEITEM hSubItem;
TCHAR strCurString[100];
long lResult;
DWORD dwCurIndex=0;
HKEY hCurKey;
CString strCurKey;
CString strSubKey=strKey;
CString str=strKey;
if(strKey=="")
{
AddDummyNode(hItem);
return 0;
}
CWaitCursor wait;
//CRegExplorerDoc* pDoc = GetDocument();
//pDoc->m_Ex