⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regeditview.cpp

📁 基于EVC环境下的注册表编辑功能的完整源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -