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

📄 mylistview.cpp

📁 基于EVC环境下的注册表编辑功能的完整源代码
💻 CPP
字号:
// MyListView.cpp : implementation file
//

#include "stdafx.h"
#include "RegEdit.h"
#include "MyListView.h"
#include "SetSZValue.h"
#include "SetDWORDValue.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyListView

IMPLEMENT_DYNCREATE(CMyListView, CListView)

CMyListView::CMyListView()
{
}

CMyListView::~CMyListView()
{
}


BEGIN_MESSAGE_MAP(CMyListView, CListView)
	//{{AFX_MSG_MAP(CMyListView)
	ON_COMMAND(ID_REFRESH, OnRefresh)
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	ON_WM_LBUTTONDBLCLK()
	ON_COMMAND(ID_DEL, OnDel)
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyListView drawing

void CMyListView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CMyListView diagnostics

#ifdef _DEBUG
void CMyListView::AssertValid() const
{
	CListView::AssertValid();
}

void CMyListView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyListView message handlers

void CMyListView::OnInitialUpdate() 
{
	CListView::OnInitialUpdate();
	CListCtrl& m_Ctrl=GetListCtrl();

	CRect rect;
	GetClientRect(rect);
	int width=rect.Width()/3;
	///////////////////////////////////////////////////////////////
	DWORD dwStyle = GetWindowLong( m_hWnd,GWL_STYLE);

	SetWindowLong( m_hWnd,GWL_STYLE,dwStyle|LVS_REPORT/*|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS*/);
	//设置扩展风格
	 DWORD styles=LVS_EX_FULLROWSELECT;
	//Use macro since this is new and not im MFC
 	ListView_SetExtendedListViewStyleEx(m_hWnd,styles,styles);
	// TODO: Add your specialized code here and/or call the base class

	m_Ctrl.InsertColumn(0,_T("名称"),LVCFMT_LEFT,width);// ,0);
	m_Ctrl.InsertColumn(1,_T("类型"),LVCFMT_LEFT,width );//,1);
	m_Ctrl.InsertColumn(2,_T("数据"),LVCFMT_LEFT,width );//,2);
////////////////////////////////////////////////////////////////////
 	m_ImageList.Create(17, 16,ILC_COLOR, 0, 4);
	CBitmap bm;
 	bm.LoadBitmap(IDB_BITMAP1);
 	ImageSZ=m_ImageList.Add(&bm, RGB(0, 0, 0));
	bm.DeleteObject();
 	bm.LoadBitmap(IDB_BITMAP2);
 	ImageDWORD=m_ImageList.Add(&bm, RGB(0, 0, 0)); 
	
 	m_Ctrl.SetImageList(&m_ImageList,LVSIL_SMALL); 

}

void CMyListView::DispValue(HKEY hKey)
{
	CListCtrl & m_Ctrl=GetListCtrl();
	m_Ctrl.DeleteAllItems();
	int temp;	
	LONG iRet=ERROR_SUCCESS;
	DWORD dwType,dwNameLength,index,cbMaxValueLen,dwDataLength;

	LPBYTE lpData=0;
	h_CurentKey=hKey;
	if(hKey==NULL) return;
	TCHAR NameBuffer[256];
	TCHAR DataBuffer[256];
		 
	dwType=REG_SZ;//查找类型为字符串型

	dwNameLength=sizeof(NameBuffer);//名称长度

	CString strData;
	index=0;
	LV_ITEM item;
	item.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
	item.iSubItem=0;
	item.iItem=0;
	item.iImage=ImageSZ;

	iRet = RegQueryInfoKey(hKey,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &cbMaxValueLen,NULL, NULL);
		if (iRet != ERROR_SUCCESS)
	{
	if (!(hKey == HKEY_LOCAL_MACHINE 
		||hKey == HKEY_CURRENT_USER 
		||hKey== HKEY_CLASSES_ROOT 
		||hKey== HKEY_USERS 
		))
			RegCloseKey(hKey);
		return;
	}


	index=0;
	lpData = new BYTE[cbMaxValueLen+2];
	memset(lpData,0,cbMaxValueLen+2);

	while(iRet==ERROR_SUCCESS)
	{
		dwDataLength = cbMaxValueLen;
		dwNameLength = sizeof(NameBuffer)/sizeof(TCHAR);
		memset(lpData,0,cbMaxValueLen+2);
		memset(NameBuffer,0,sizeof(NameBuffer));
		iRet = RegEnumValue(hKey, index,NameBuffer, &dwNameLength, NULL, &dwType, lpData, &dwDataLength);
		
		if (iRet != ERROR_SUCCESS)		
			continue;
	
		int i=m_Ctrl.GetItemCount();
	    switch(dwType)
		{
		case REG_SZ: 
		
			swprintf(DataBuffer,_T("%s"),(LPCTSTR)lpData);
				
			if(wcslen(NameBuffer)==0)			
			{	
				wcscpy(NameBuffer,_T("(默认)"));
		    	if(lpData[0]=='0'&&lpData[1]=='0')
				wcscpy(DataBuffer,_T("(数值未设置)"));
			}
			temp=m_Ctrl.InsertItem(i,NameBuffer,ImageSZ);
			m_Ctrl.SetItemText (temp,1,_T("REG_SZ"));
			m_Ctrl.SetItemText (temp,2,DataBuffer);
			break;
		case REG_DWORD:
		 
			temp=m_Ctrl.InsertItem(i,NameBuffer,ImageDWORD);
			m_Ctrl.SetItemText (temp,1,_T("REG_DWORD"));

			strData.Format(_T("%x"),*((LPDWORD)lpData));
			while(strData.GetLength ()<8)
				strData="0"+strData;
			swprintf(DataBuffer,_T("0x%s(%ld)"),strData,*((LPDWORD)lpData));
			m_Ctrl.SetItemText (temp,2,DataBuffer);
			break;
		case REG_BINARY: 

			{
			CString strTemp = _T("");
			 for (DWORD x = 0; x<cbMaxValueLen&& x< 16; ++x)
			{
			CString hd;
			hd.Format(TEXT(" %02X"), lpData[i]);
			strTemp += hd;
			 }
			 swprintf(DataBuffer,_T("%s"),strTemp);
		//	szVal = strTemp.GetBuffer(0) + 1;
			}
			temp=m_Ctrl.InsertItem(i,NameBuffer,ImageDWORD);
			m_Ctrl.SetItemText (temp,1,_T("REG_BINARY"));
			swprintf(DataBuffer,_T("%s"),(LPCTSTR)lpData);
			m_Ctrl.SetItemText (temp,2,DataBuffer);
			break;
		case REG_NONE:
			temp=m_Ctrl.InsertItem(i,NameBuffer,ImageDWORD);
			m_Ctrl.SetItemText (temp,1,_T("REG_NONE"));
			swprintf(DataBuffer,_T("%s"),(LPCTSTR)lpData);
			m_Ctrl.SetItemText (temp,2,DataBuffer);
			break;
	 	default:
			temp=m_Ctrl.InsertItem(i,NameBuffer,ImageDWORD);
			m_Ctrl.SetItemText (temp,1,_T("REG_NONE"));
			swprintf(DataBuffer,_T("%s"),(LPCTSTR)lpData);
			m_Ctrl.SetItemText (temp,2,DataBuffer);
			break;

		}
	    index=index+1;
	}
	delete [] lpData;
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	int j=m_Ctrl.GetItemCount ();
	for(int k=0;k<j;k++)
	{
	 m_Ctrl.SetItemData(k,k);
	}
	m_Ctrl.SortItems(MyCompareProc,(LPARAM)&m_Ctrl);
}

int CALLBACK  CMyListView::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
   CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
   CString    strItem1 = pListCtrl->GetItemText(lParam1, 0);
   CString    strItem2 = pListCtrl->GetItemText(lParam2, 0);

  //  return strcmp(strItem2, strItem1);
   return wcscmp(strItem1, strItem2);
}

void CMyListView::OnDel() 
{
	// TODO: Add your command handler code here
	CPoint pt;
	CListCtrl & m_Ctrl=GetListCtrl();
	GetCursorPos(&pt);
	ScreenToClient(&pt);
	int iItem;

    POSITION pos =m_Ctrl.GetFirstSelectedItemPosition();
     if (pos == NULL)
   TRACE0("No items were selected!\n");

	while(pos)
	{
	iItem=m_Ctrl.GetNextSelectedItem(pos);
	CString strValueName=m_Ctrl.GetItemText(iItem,0);
	RegDeleteValue(h_CurentKey,(LPCTSTR)strValueName);
	}
	//MessageBox(_T("On CMyListView Del"),NULL,MB_OK);
	DispValue(h_CurentKey);
}

void CMyListView::OnRefresh() 
{
	// TODO: Add your command handler code here
//	MessageBox(_T("MYLIst Refresh"),NULL,MB_OK);
	CListCtrl & m_Ctrl=GetListCtrl();
	m_Ctrl.DeleteAllItems();
	DispValue(h_CurentKey);
}

void CMyListView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
		// TODO: Add your message handler code here
	CPoint point;
 
	GetCursorPos(&point);
    //ScreenToClient(&point);
 
	CListCtrl& m_Ctrl=GetListCtrl();

	int iItem=m_Ctrl.HitTest(point,NULL);
	POSITION pos = m_Ctrl.GetFirstSelectedItemPosition();
    if (pos == NULL)
     return;


	CMenu menue,*pmenue;
	menue.LoadMenu(IDR_MENU1);
	pmenue=menue.GetSubMenu (1);

 	pmenue->TrackPopupMenu( TPM_LEFTALIGN,point.x,point.y,this);
	*pResult = 0;
}

void CMyListView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
		CListCtrl& m_Ctrl=GetListCtrl();

    int iHitItem= m_Ctrl.HitTest(point, NULL); 
	if(iHitItem==-1)
	return;
	CString strType;
	CString strValue,strName;
    
	strName=m_Ctrl.GetItemText (iHitItem,0);
	strType=m_Ctrl.GetItemText(iHitItem,1);
	strValue=m_Ctrl.GetItemText(iHitItem,2);
	
	if(strType=="REG_SZ")
	{
		CSetSZValue SetSZValue;	
		SetSZValue.Disp (h_CurentKey,strName,strValue);
		strValue=SetSZValue.m_Value;
	//	m_Ctrl.SetItemText (iHitItem,2,(LPCSTR)strValue);

	}
	if(strType=="REG_DWORD")
	{
		CSetDWORDValue SetDword;
		SetDword.Disp(h_CurentKey,strName,strValue);
		//strValue.Format ("%ul",SetDword.m_Value);
	}
    DispValue(h_CurentKey);
	CListView::OnLButtonDblClk(nFlags, point);
}



void CMyListView::OnDell()
{
  OnDel();
}

void CMyListView::OnSize(UINT nType, int cx, int cy) 
{
	CListView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	CListCtrl& m_Ctrl=GetListCtrl();

	CRect rect;
	GetClientRect(rect);
	int width=rect.Width()/3;

	if(width>100)
	{
	m_Ctrl.SetColumnWidth (0,width);
	m_Ctrl.SetColumnWidth (1,width);
	m_Ctrl.SetColumnWidth(2,width);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -