📄 detailview.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 + -