📄 regeditview.cpp
字号:
// RegEditView.cpp : implementation of the CRegEditView class
//
#include "stdafx.h"
#include "RegEdit.h"
#include "MyListView.h"
#include "MainFrm.h"
#include "DialogNewKey.h"
#include "NewSZValue.h"
#include "NewValueDWORD.h"
#include "RegEditDoc.h"
#include "RegEditView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRegEditView
IMPLEMENT_DYNCREATE(CRegEditView, CTreeView)
BEGIN_MESSAGE_MAP(CRegEditView, CTreeView)
//{{AFX_MSG_MAP(CRegEditView)
ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
ON_COMMAND(ID_EXPAND, OnExpand)
ON_COMMAND(ID_REFRESH, OnRefresh)
ON_COMMAND(ID_NEW_KEY, OnNewKey)
ON_COMMAND(ID_NEW_SZ, OnNewSz)
ON_COMMAND(ID_NEW_DWORD, OnNewDword)
ON_COMMAND(ID_DEL, OnDel)
ON_COMMAND(ID_DEL_VALUE, OnDelValue)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRegEditView construction/destruction
CRegEditView::CRegEditView()
{
// TODO: add construction code here
}
CRegEditView::~CRegEditView()
{
}
BOOL CRegEditView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CTreeView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CRegEditView drawing
void CRegEditView::OnDraw(CDC* pDC)
{
CRegEditDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CRegEditView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
CTreeCtrl& m_Ctrl=GetTreeCtrl();
DWORD dwStyle = GetWindowLong(m_Ctrl.m_hWnd,GWL_STYLE);
dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;
SetWindowLong(m_Ctrl.m_hWnd,GWL_STYLE,dwStyle);
m_ImageList.Create(32, 32, ILC_COLOR, 0, 4);
ImageSelected=m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICONOPEN));
ImageUnSelected=m_ImageList.Add(AfxGetApp()->LoadIcon (IDI_ICONNORMAL));
ImageRoot=m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_ROOT));
m_Ctrl.SetImageList(&m_ImageList,TVSIL_NORMAL );
AddItems();
}
/////////////////////////////////////////////////////////////////////////////
// CRegEditView diagnostics
#ifdef _DEBUG
void CRegEditView::AssertValid() const
{
CTreeView::AssertValid();
}
void CRegEditView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
CRegEditDoc* CRegEditView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRegEditDoc)));
return (CRegEditDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CRegEditView message handlers
void CRegEditView::AddItems()
{
//添加我的电脑图标
TV_INSERTSTRUCT InsertItem;
InsertItem.hParent=TVI_ROOT;
InsertItem.hInsertAfter=TVI_LAST;
InsertItem.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
InsertItem.item.iImage=ImageRoot;
InsertItem.item.iSelectedImage=ImageRoot;
InsertItem.item.pszText=_T("我的电脑");
CTreeCtrl& m_Ctrl=GetTreeCtrl();
HTREEITEM hItem;
hItem=m_Ctrl.InsertItem(&InsertItem);
/*
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
*/
//在树视图中添加“HKEY_CLASSES_ROOT”并查找它的子键
InsertItem.hParent=hItem;
InsertItem.hInsertAfter=TVI_LAST;
InsertItem.item.iImage=ImageUnSelected;
InsertItem.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
InsertItem.item.iSelectedImage=ImageSelected;
InsertItem.item.pszText=_T("HKEY_CLASSES_ROOT");
HTREEITEM hSubItem=m_Ctrl.InsertItem(&InsertItem);
HKEY hKey=HKEY_CLASSES_ROOT;
FindRegSubKeyOnce(hKey,hSubItem);
// FindRegSubKey(hKey,hSubItem);
///////////////////////////////////////////////////////
//在树视图中添加“HKEY_CURRENT_USER”并查找它的子键
InsertItem.item.pszText=_T("HKEY_CURRENT_USER");
hSubItem=m_Ctrl.InsertItem(&InsertItem);
hKey=HKEY_CURRENT_USER;
FindRegSubKeyOnce(hKey,hSubItem);
//在树视图中添加“HKEY_LOCAL_MACHINE”并查找它的子键
InsertItem.item.pszText=_T("HKEY_LOCAL_MACHINE");
hSubItem=m_Ctrl.InsertItem(&InsertItem);
hKey=HKEY_LOCAL_MACHINE;
FindRegSubKeyOnce(hKey,hSubItem);
/*
//在树视图中添加“HKEY_USERS”并查找它的子键
InsertItem.item.pszText=_T("HKEY_USERS");
hSubItem=m_Ctrl.InsertItem(&InsertItem);
hKey=HKEY_USERS;
FindRegSubKeyOnce(hKey,hSubItem);
*/
///////////////////////////////////////////////////
//在树视图中添加“HKEY_CURRENT_CONFIG”并查找它的子键
m_Ctrl.Expand(hItem,TVE_EXPAND);
}
LONG CRegEditView::FindRegSubKey(HKEY hKey, HTREEITEM hItem)
{
DWORD index=0;
TCHAR buffer[512];
DWORD dwLength=512;
LONG iRet=ERROR_SUCCESS;
////////////////////////////////////////
HTREEITEM hSubItem;
////////////////////////////////////////////////
//TV_INSERTSTRUCT
TV_INSERTSTRUCT InsertItem;
InsertItem.hParent=hItem;
InsertItem.hInsertAfter=TVI_SORT;
InsertItem.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
InsertItem.item.iImage=ImageUnSelected;
InsertItem.item.iSelectedImage=ImageSelected;
///////////////////////////////////////////////////
CTreeCtrl& m_Ctrl=GetTreeCtrl();
////////////////////////////////////////////////
while(ERROR_NO_MORE_ITEMS!=iRet)
{
InsertItem.hParent=hItem;
dwLength=sizeof(buffer)/sizeof(TCHAR);
iRet=RegEnumKeyEx(hKey,index,buffer,&dwLength,NULL,NULL,NULL,NULL);
//将找到的子键添加到树形结构中
if(iRet==ERROR_SUCCESS)
{
InsertItem.item.pszText=buffer;
hSubItem=m_Ctrl.InsertItem(&InsertItem);
//打开当前子键
HKEY hSubKey;
if(ERROR_SUCCESS==RegOpenKeyEx(hKey,buffer,NULL,KEY_ALL_ACCESS,&hSubKey))
{
/* if(RegEnumKey(hKey,0,buffer,sizeof(buffer))==ERROR_SUCCESS)
{
InsertItem.hParent=hSubItem;
InsertItem.item.pszText=buffer;
m_Ctrl.InsertItem (&InsertItem);
}*/
FindRegSubKeyOnce(hSubKey,hSubItem);
RegCloseKey(hSubKey);
}
}
++index;
}
return iRet;
}
void CRegEditView::FindRegSubKeyOnce(HKEY hKey, HTREEITEM hItem)
{
LONG iRet;
TCHAR buffer[1024];
DWORD dwLength=sizeof(buffer)/sizeof(TCHAR);
CTreeCtrl& m_Ctrl=GetTreeCtrl();
//////////////////////////////////////////////////////////////
TV_INSERTSTRUCT InsertItem;
InsertItem.hParent=hItem;
InsertItem.hInsertAfter=TVI_SORT;
InsertItem.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE;
InsertItem.item.iImage=ImageUnSelected;
InsertItem.item.iSelectedImage=ImageSelected;
/////////////////////////////////////////////////////////////
iRet=RegEnumKeyEx(hKey,0,buffer,&dwLength,NULL,NULL,NULL,NULL);//查找当前子键下的子键
if(iRet==ERROR_SUCCESS)
{
InsertItem.hParent=hItem;
InsertItem.item.pszText=buffer;
m_Ctrl.InsertItem(&InsertItem);
}
}
void CRegEditView::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
CTreeCtrl& m_Ctrl=GetTreeCtrl();
// TODO: Add your control notification handler code here
//如果是合拢操作,则直接返回
//////////////////////////////////////////////////////////////////////////
if(pNMTreeView->action==1) return;
HKEY hRoot,hKey;
CPoint pt;
int iSubCount;
UINT uFlags;
//CString sSubkey;
/////////////////////////////////////////////////////////////
GetCursorPos(&pt);
ScreenToClient(&pt);
HTREEITEM hItemRoot = m_Ctrl.GetRootItem();
m_hHitItem = m_Ctrl.HitTest(pt, &uFlags);
//如果当前结点是根结点则直接返回
if( hItemRoot==m_hHitItem) return;
if(m_hHitItem!=NULL)
{
//CString str=m_Ctrl.GetItemText(m_hHitItem);
iSubCount=GetItemChildCount(m_hHitItem);
if(iSubCount!=1)//当前子结点下的子键数是否为1资源
return;
SetCursor(AfxGetApp()->LoadCursor(MAKEINTRESOURCE(IDC_CURSOR1)));
m_Ctrl.DeleteItem (m_Ctrl.GetChildItem(m_hHitItem));//删除当前项下的子项,然后重新添加
GetItemPath(hRoot,strSubKey,m_hHitItem);
if(m_Ctrl.GetParentItem (m_hHitItem)==hItemRoot)
hKey=hRoot;//如果是根键就不用再RegOpenKeyEx
else if(RegOpenKeyEx(hRoot,(LPCTSTR)strSubKey,0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS)
{
MessageBox(_T("error"),NULL,MB_OK);
return;
}
FindRegSubKey(hKey,m_hHitItem);
// RegCloseKey(hRoot);
RegCloseKey(hKey);
}
SetCursor( AfxGetApp()->LoadCursor (IDC_APPSTARTING));
/////////////////////////////////////////////////////////////
*pResult = 0;
}
int CRegEditView::GetItemChildCount(HTREEITEM hItem)
{
CTreeCtrl& m_Ctrl=GetTreeCtrl();
int count=0;//计算机当前结点有多小个子结点
if(m_Ctrl.ItemHasChildren(hItem))
{
HTREEITEM hNextItem;
HTREEITEM hChildItem=m_Ctrl.GetChildItem (hItem);
while(hChildItem!=NULL)
{
count=count+1;
hNextItem=m_Ctrl.GetNextItem(hChildItem,TVGN_NEXT);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -