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

📄 detailview.cpp

📁 有关界面的编程源码。很有参考价值!值得一看
💻 CPP
字号:
// DetailView.cpp : implementation file
//

#include "stdafx.h"
#include "Redit.h"
#include "DetailView.h"
#include "DlgAddValue.h"
#include "DlgData.h"
#include "MainFrm.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDetailView

IMPLEMENT_DYNCREATE(CDetailView, CListView)

CDetailView::CDetailView()
{
}

CDetailView::~CDetailView()
{
}


BEGIN_MESSAGE_MAP(CDetailView, CListView)
	//{{AFX_MSG_MAP(CDetailView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	ON_WM_DESTROY()
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_TEST_NEW_STRINGVALUE, OnAddString)
	ON_COMMAND(ID__DELETE, OnDeleteValue)
	ON_COMMAND(ID_TEST_NEW_DWORDVALUE, OnAddDword)
	ON_COMMAND(ID_TEST_MODIFY, OnModify)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDetailView drawing

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

/////////////////////////////////////////////////////////////////////////////
// CDetailView diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CDetailView message handlers


static LPTSTR RegTypeNameFromType(DWORD dwType)
{
	switch (dwType)
	{
	case REG_SZ:
		return _T("REG_SZ");
	case REG_DWORD:
		return _T("REG_DWORD");
	case REG_MULTI_SZ:
		return _T("REG_MULTI_SZ");
	case REG_BINARY:
		return _T("REG_BINARY");
	case REG_EXPAND_SZ:
		return _T("REG_EXPAND_SZ");
	default:
		return _T("UNKNOWN");	
	}
}

static LPTSTR ShortFormStrForValue(const CRegNode *pNode, CString &strTemp)
{
	LPTSTR szVal = 0;
	if (!pNode->m_lpData)
	{
		strTemp = TEXT("(Null)");
		szVal = strTemp.GetBuffer(0);
	}
	else if (pNode->m_dwDataType == REG_SZ || pNode->m_dwDataType == REG_EXPAND_SZ)
	{
		szVal = (LPTSTR) pNode->m_lpData;
	}
	else if (pNode->m_dwDataType == REG_DWORD)
	{
		strTemp.Format(_T("0x%X"), *((LPDWORD)pNode->m_lpData));
		szVal = strTemp.GetBuffer(0);
	}
	else if (pNode->m_dwDataType == REG_BINARY)
	{
		strTemp = _T("");
		for (DWORD i = 0; i < pNode->m_dwDataSize && i < 16; ++i)
		{
			CString hd;
			hd.Format(TEXT(" %02X"), pNode->m_lpData[i]);
			strTemp += hd;
		}
		szVal = strTemp.GetBuffer(0) + 1;
	}
	else
	{
		strTemp = _T("Unimplemented!");
		szVal = strTemp.GetBuffer(0);
	}

	return szVal;
}

void CDetailView::AddDetail(CRegNode *pNode)
{
	CListCtrl& list = GetListCtrl();
	CString strTemp;

	int nTotal = list.GetItemCount();
	LVITEM lvi;
	lvi.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
	lvi.iItem = nTotal;
	lvi.iSubItem  = 0;
	lvi.pszText = pNode->m_strName.GetBuffer(0);
	lvi.iImage = (pNode->m_dwDataType == REG_SZ) ? 6 : 11;
	lvi.lParam = (LPARAM)pNode;
	int nIndex = list.InsertItem(&lvi);

	lvi.iSubItem = 1;
	lvi.mask = LVIF_TEXT;
	lvi.pszText = RegTypeNameFromType(pNode->m_dwDataType);
	list.SetItem(&lvi);	

	lvi.iSubItem = 2;
	lvi.mask = LVIF_TEXT;
	lvi.pszText = ShortFormStrForValue(pNode, strTemp);
	list.SetItem(&lvi);	
}

void CDetailView::Clear()
{
	CListCtrl& list = GetListCtrl();
	list.DeleteAllItems();

	if (m_ImageList.GetSafeHandle())
		m_ImageList.DeleteImageList();
}

inline CDetailView *GetListView() 
{ 
#ifndef _WIN32_WCE
	return (CDetailView *)((CMainFrame *)AfxGetMainWnd())->m_SplitWnd.GetPane(0, 1); 
#else
	return (CDetailView *)((CMainFrame *)AfxGetMainWnd())->m_SplitWnd.GetPane(1, 0); 
#endif
}

void CDetailView::OnInitialUpdate() 
{
	CListView::OnInitialUpdate();
	
	Clear();	// if called again

	CListCtrl& list = GetListCtrl();
	list.ModifyStyle(0, LVS_REPORT|LVS_NOSORTHEADER|LVS_SHOWSELALWAYS, 0);

	list.InsertColumn(0, _T("Name"), 80);
	list.InsertColumn(1, _T("Type"), 80);
	list.InsertColumn(2, _T("Data"), 160);
	list.SetColumnWidth(0, 100);
	list.SetColumnWidth(1, 100);
	list.SetColumnWidth(2, 400);
	// TODO: Add your specialized code here and/or call the base class
	m_ImageList.Create(IDB_BITMAP1, 16, 5, RGB(255, 0, 255));
	list.SetImageList(&m_ImageList, TVSIL_NORMAL);
	
	if (m_DetailTrayMenu.LoadMenu(MAKEINTRESOURCE(IDR_MENU_DATACNTXT)))
	{
		m_DetailTraySubMenu.Attach(m_DetailTrayMenu.GetSubMenu(0)->Detach());		
	}
}

void CDetailView::OnDestroy() 
{
	
	// TODO: Add your message handler code here
	Clear();	
	CListView::OnDestroy();
}

void CDetailView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	CListCtrl& list = GetListCtrl();
	CRegNode *pNode;
	CDlgData dlg;
	NMLISTVIEW *lpNmList = (NMLISTVIEW *)pNMHDR;
	if (lpNmList->iItem >= 0)
		if (pNode = (CRegNode *)list.GetItemData(lpNmList->iItem))
		{
			dlg.m_pNode = pNode;
			if (dlg.DoModal() == IDOK)
			{
				Refresh(lpNmList->iItem, pNode);
			}
		}

	*pResult = 0;
}

void CDetailView::Refresh(UINT nItemId, CRegNode *pNode)
{
	
	CListCtrl& list = GetListCtrl();
	CString strTemp;
	BOOL bRet;
	LVITEM lvi;
	lvi.mask = LVIF_TEXT;
	lvi.iItem = nItemId;
	lvi.iSubItem = 0;
	lvi.pszText = (LPTSTR)(LPCTSTR)pNode->m_strName;
	bRet = list.SetItem(&lvi);	

	lvi.iSubItem = 1;
	lvi.pszText = RegTypeNameFromType(pNode->m_dwDataType);
	bRet = list.SetItem(&lvi);	

	lvi.iSubItem = 2;
	lvi.mask = LVIF_TEXT;
	lvi.pszText = ShortFormStrForValue(pNode, strTemp);
	bRet = list.SetItem(&lvi);	
}

void CDetailView::DisplayValues(CRegNode *pNode)
{
	CRegNode *pTemp;
	m_pCurrentNode = pNode;
	pTemp = pNode->m_pFirstChild;
	
	CListCtrl& list = GetListCtrl();
	list.DeleteAllItems();

	while (pTemp)
	{
		if (pTemp->m_dwType & REGNODE_TYPE_VALUE)
		{
			AddDetail(pTemp);
		}
		pTemp = pTemp->m_pNextSibling;
	}
}

void CDetailView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	CPoint point;
	UINT Flags = 0;
	CListCtrl& list = GetListCtrl();

	GetCursorPos(&point);

	BOOL bRet = m_DetailTraySubMenu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this, NULL);
	list.ScreenToClient(&point);
	m_nItemIndex = list.HitTest(point, &Flags);

	*pResult = 0;
}

void CDetailView::OnAddString()
{
	CDlgAddValue dlg;
	LONG lRet = 0;
	CRegNode *pNode = NULL;
	LPBYTE lpData;
	DWORD dwDataSize = 0, dwDataType;
	HKEY hKey;
	dlg.m_dwDataType = REG_SZ;
	if (dlg.DoModal() == IDOK)
	{				
		CString strValueName;

		strValueName = dlg.m_strValueName;
		hKey = m_pCurrentNode->GetKeyHandle();
		if (RegQueryValueEx(hKey, strValueName, 0, &dwDataType, NULL, &dwDataSize) == ERROR_SUCCESS)
		{
			AfxMessageBox(_T("Value of this name already exists!"));
			return;
		}
		dwDataSize = (dlg.m_strValueData.GetLength() + 1)* sizeof(TCHAR);
		lpData = new BYTE[dwDataSize];
		_tcscpy((TCHAR *)lpData, (LPCTSTR)dlg.m_strValueData);
		if (hKey)
		{
			lRet = RegSetValueEx(hKey, (LPCTSTR)strValueName, 0, REG_SZ, (LPBYTE)lpData, dwDataSize);
			if (lRet == ERROR_SUCCESS)
			{
				pNode = new CRegNode(strValueName, REGNODE_TYPE_VALUE);
				pNode->m_dwDataType = REG_SZ;
				pNode->m_lpData = lpData;
				pNode->m_dwDataSize = dwDataSize;
				AddNode(pNode, m_pCurrentNode);
				DisplayValues(m_pCurrentNode);
			}
			else
			{
				CString strTemp;
				strTemp.Format(_T("Add String Value failed, Err = %ld!"), lRet);
				AfxMessageBox(strTemp);
				delete lpData;
			}
			RegCloseKey(hKey);
		}
	}
}

void CDetailView::OnDeleteValue()
{
	LONG lRet = 0;
	CRegNode *pNode = NULL;
	CString strTemp;

	CListCtrl& list = GetListCtrl();

	if (m_nItemIndex < 0)
		return;
	pNode = (CRegNode *)list.GetItemData(m_nItemIndex);
	strTemp.Format(_T("Do you really want to delete this value (%s)?"), (LPCTSTR)pNode->m_strName);
	if (AfxMessageBox(strTemp, MB_YESNO) == IDYES)
	{				
		HKEY hKey = m_pCurrentNode->GetKeyHandle();
		lRet = RegDeleteValue(hKey, (LPCTSTR)pNode->m_strName);
		if (lRet == ERROR_SUCCESS)
		{
			DeleteNode(pNode);
			DisplayValues(m_pCurrentNode);
		}
		RegCloseKey(hKey);
	}
}

void CDetailView::OnAddDword()
{
	CDlgAddValue dlg;
	LONG lRet = 0;
	CRegNode *pNode = NULL;
	LPBYTE lpData;
	DWORD dwDataSize = 0, dwData = 0, dwDataType;
	HKEY hKey;

	dlg.m_dwDataType = REG_DWORD;
	if (dlg.DoModal() == IDOK)
	{				
		CString strValueName;

		strValueName = dlg.m_strValueName;
		hKey = m_pCurrentNode->GetKeyHandle();
		if (RegQueryValueEx(hKey, strValueName, 0, &dwDataType, NULL, &dwDataSize) == ERROR_SUCCESS)
		{
			AfxMessageBox(_T("Value of this name already exists!"));
			return;
		}
		dwDataSize = sizeof(DWORD);
		lpData = new BYTE[dwDataSize];
		*((DWORD *)lpData) = _ttol((LPCTSTR)dlg.m_strValueData);
		lRet = RegSetValueEx(hKey, (LPCTSTR)strValueName, 0, REG_DWORD, (LPBYTE)lpData, dwDataSize);
		if (lRet == ERROR_SUCCESS)
		{
			pNode = new CRegNode(strValueName, REGNODE_TYPE_VALUE);
			pNode->m_dwDataType = REG_DWORD;
			pNode->m_lpData = lpData;
			pNode->m_dwDataSize = dwDataSize;
			AddNode(pNode, m_pCurrentNode);
			DisplayValues(m_pCurrentNode);
		}
		else
		{
			CString strTemp;
			strTemp.Format(_T("Add DWORD Value failed, Err = %ld!"), lRet);
			AfxMessageBox(strTemp);
			delete lpData;
		}
		RegCloseKey(hKey);
	}
}

void CDetailView::OnModify()
{

	CListCtrl& list = GetListCtrl();
	CRegNode *pNode = NULL;

	if (m_nItemIndex < 0)
		return;
	pNode = (CRegNode *)list.GetItemData(m_nItemIndex);
	CDlgData dlg;
	if (pNode = (CRegNode *)list.GetItemData(m_nItemIndex))
	{
		dlg.m_pNode = pNode;
		if (dlg.DoModal() == IDOK)
		{
			Refresh(m_nItemIndex, pNode);
		}
	}
}

void CDetailView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CListCtrl& list = GetListCtrl();
	UINT Flags;

	m_nItemIndex = list.HitTest(point, &Flags);
	if (m_nItemIndex < 0)
		return;

#if defined(_WIN32_WCE) 
#if !defined(_X86_) && !defined(WIN32_PLATFORM_HPC2000)
	m_PtGesture = point;
	ClientToScreen(&m_PtGesture);
	//SHRecognizeGesture(point, TRUE);
#endif
#endif

	CListView::OnLButtonDown(nFlags, point);
}

⌨️ 快捷键说明

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