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

📄 reditview.cpp

📁 分别可以在EVC和VC下编译出WM版和Windows版
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	ScreenToClient(&point);
	CTreeCtrl &treeCtl = GetTreeCtrl();
	HTREEITEM hItem = treeCtl.HitTest(point, &nFlags);
	if ((nFlags & TVHT_ONITEM) && hItem)
	{
		CRegNode *pNode = (CRegNode *)GetTreeCtrl().GetItemData(hItem);
		if (pNode && !(pNode->m_dwType & REGNODE_TYPE_TOPMOST))
		{
			BOOL bRet = m_TreeTraySubMenu.TrackPopupMenu(TPM_LEFTALIGN, pointSc.x, pointSc.y, this, NULL);
		}
	}	
	*pResult = 0;
}

void CReditView::OnCreateNewKey()
{
	CDlgCreateKey dlg;
	CRegNode *pnodeItem, *pnodeItemParent;
	CTreeCtrl &treeCtl = GetTreeCtrl();
	HTREEITEM hItem = treeCtl.GetSelectedItem();
	DWORD dwDisposition;
	HKEY hNewKey, hKeyParent;
	LONG lErr;
	if (hItem)
	{
		pnodeItemParent = (CRegNode *)treeCtl.GetItemData(hItem);
		if (dlg.DoModal() == IDOK)
		{
			hKeyParent = pnodeItemParent->GetKeyHandle();
			lErr = RegCreateKeyEx(hKeyParent, dlg.m_strKeyName, 0, _T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hNewKey, &dwDisposition);
			if (lErr == ERROR_SUCCESS)
			{
				pnodeItem = new CRegNode(dlg.m_strKeyName, REGNODE_TYPE_KEY);
				::AddNode(pnodeItem, pnodeItemParent);
				pnodeItem->m_hItem = treeCtl.InsertItem(pnodeItem->m_strName, 31, 12, hItem);
				treeCtl.SetItemData(pnodeItem->m_hItem, (DWORD)pnodeItem);
				RegCloseKey(hNewKey);
				pnodeItem->m_bLoaded = TRUE;
			}
			RegCloseKey(hKeyParent);
		}
	}
}

void CReditView::OnNewStringValue()
{
	CTreeCtrl &treeCtl = GetTreeCtrl();
	HTREEITEM hItem = treeCtl.GetSelectedItem();
	CRegNode *pNode;

	if (hItem)
	{
		pNode = (CRegNode *)treeCtl.GetItemData(hItem);
		if (pNode)
		{
			DisplayValue(pNode); // just to initialize the current node;
			CDetailView *pView = GetListView();
			pView->SendMessage(WM_COMMAND, ID_TEST_NEW_STRINGVALUE, 0);
		}
	}
}

void CReditView::OnNewDwordValue()
{
	CTreeCtrl &treeCtl = GetTreeCtrl();
	HTREEITEM hItem = treeCtl.GetSelectedItem();
	CRegNode *pNode;

	if (hItem)
	{
		pNode = (CRegNode *)treeCtl.GetItemData(hItem);
		if (pNode)
		{
			DisplayValue(pNode); // just to initialize the current node;
			CDetailView *pView = GetListView();
			pView->SendMessage(WM_COMMAND, ID_TEST_NEW_DWORDVALUE, 0);
		}
	}
}

void CReditView::OnKeyDelete()
{
	CTreeCtrl &treeCtl = GetTreeCtrl();
	HTREEITEM hItem = treeCtl.GetSelectedItem();
	CRegNode *pNode;
	CString strTemp;
	if (hItem)
	{
		pNode = (CRegNode *)treeCtl.GetItemData(hItem);
		// only allow delete nodes of one level down from Standard HKLM HKCU keys
		if (pNode)
		{
			strTemp.Format(_T("Do you really want to delete this key (%s), its subkeys and values?"), (LPCTSTR)pNode->m_strName);
			if (pNode->m_pParent && pNode->m_pParent->m_pParent &&  (AfxMessageBox(strTemp, MB_YESNO) == IDYES))
			{
				treeCtl.DeleteItem(pNode->m_hItem);
				// delete all subkeys
				CRegNode *pTemp = pNode->m_pFirstChild, *pTemp2;
				while (pTemp)
				{
					pTemp2 = pTemp;
					pTemp = pTemp->m_pNextSibling;
					delete pTemp2;
				}
				pNode->m_pFirstChild = NULL;
				pNode->m_bLoaded = FALSE;
				// load this key recursively (only keys and subkeys)
				LoadKeysRecursive(pNode);
				if (DeleteKeyRecursive(pNode))
				{
					DeleteNode(pNode);
				}
			}
		}
	}
}

void CReditView::OnKeyRename()
{
	CTreeCtrl &treeCtl = GetTreeCtrl();
	CRegNode *pNode;
	CString strTemp1;
	CDlgRenameKey dlg;
	HTREEITEM hItem, hItem2, hItem3;

	hItem = treeCtl.GetSelectedItem();
	if (hItem)
		pNode = (CRegNode *)treeCtl.GetItemData(hItem);
	if (!pNode)
		return;
	// load all values subkeys and values
	// delete key, values, subkeys and values
	// create new key, values, subkeys and values
	// delete all subkeys
	dlg.m_strOldKeyName = pNode->m_strName;
	if (dlg.DoModal() == IDOK && dlg.m_strNewKeyName.GetLength())
	{
		// delete all subkeys and values
		// reset to not loaded
		CRegNode *pTemp = pNode->m_pFirstChild, *pTemp2;
		while (pTemp)
		{
			pTemp2 = pTemp;
			pTemp = pTemp->m_pNextSibling;
			delete pTemp2;
		}
		pNode->m_pFirstChild = NULL;
		pNode->m_bLoaded = FALSE;
		pNode->m_bValuesLoaded = FALSE;
		// load this key recursively keys and subkeys and values
		LoadKeysRecursive(pNode, TRUE);
		// delete this key from registry only
		if (DeleteKeyRecursive(pNode))
		{
			// change the key name
			pNode->m_strName = dlg.m_strNewKeyName;
			// create the key, subkeys and values in registry
			CreateKeyRecursive(pNode, TRUE);
			// change item text and delete all sub tree items
			treeCtl.SetItemText(pNode->m_hItem, (LPCTSTR)pNode->m_strName);
			hItem2 = treeCtl.GetNextItem(pNode->m_hItem, TVGN_CHILD);
			while (hItem2)
			{
				hItem3 = treeCtl.GetNextItem(hItem2, TVGN_NEXT);
				treeCtl.DeleteItem(hItem2);
				hItem2 = hItem3;
			}
		}
	}
}

LONG CReditView::OnCopyKeyPath(WPARAM wParam, LPARAM lParam)
{
	CTreeCtrl &treeCtl = GetTreeCtrl();
	CRegNode *pNode;
	CString strTemp1;
	HTREEITEM hItem = treeCtl.GetSelectedItem();
	while (hItem)
	{
		pNode = (CRegNode *)treeCtl.GetItemData(hItem);
		if (pNode)
		{
			strTemp1 = pNode->m_strName + _T("\\") + strTemp1;
		}		
		hItem = treeCtl.GetParentItem(hItem);
	}
	if (strTemp1.GetLength())
	{
		if (!OpenClipboard())
		{
			AfxMessageBox(_T("Cannot copy to the Clipboard"));
			return 0;
		}
		  // Remove the current Clipboard contents
		if(!EmptyClipboard())
		{
			AfxMessageBox(_T("Cannot copy to Clipboard"));
			return 0;
		}
		// Get the currently selected data
		// For the appropriate data formats...
		HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, (strTemp1.GetLength() + 1)* sizeof(TCHAR));
		LPVOID lpData = GlobalLock(hData);
		memcpy(lpData, (LPCTSTR)strTemp1, (strTemp1.GetLength() + 1)* sizeof(TCHAR));
		GlobalUnlock(hData);

#ifdef UNICODE
		if (::SetClipboardData(CF_UNICODETEXT, hData) == NULL)
#else
		if (::SetClipboardData(CF_TEXT, hData) == NULL)
#endif
		{
			AfxMessageBox(_T("Cannot copy to Clipboard"));
			CloseClipboard();
			return 0;
		}
		CloseClipboard();
	}
	return 1L;
}


void CReditView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CTreeCtrl &treeCtl = GetTreeCtrl();

#if defined(_WIN32_WCE)
#if !defined(_X86_) && !defined(WIN32_PLATFORM_HPC2000)
	UINT nHitFlags;
	HTREEITEM hItem = treeCtl.HitTest(point, &nHitFlags);
	if ((nHitFlags & TVHT_ONITEM) && hItem)
	{
		CRegNode *pNode = (CRegNode *)GetTreeCtrl().GetItemData(hItem);
		if (pNode && !(pNode->m_dwType & REGNODE_TYPE_TOPMOST))
		{
			m_PtGesture = point;
			ClientToScreen(&m_PtGesture);
			SHRecognizeGesture(point, TRUE);
		}
	}
#endif
#endif
	
	CTreeView::OnLButtonDown(nFlags, point);
}

#if defined(_WIN32_WCE) 
#if !defined(_X86_) && !defined(WIN32_PLATFORM_HPC2000)
void CReditView::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
	NMRGINFO *pInfo = (NMRGINFO *)lParam;
	BOOL bRet = m_TreeTraySubMenu.TrackPopupMenu(TPM_LEFTALIGN, m_PtGesture.x, m_PtGesture.y, this, NULL);
}
#endif
#endif

void CReditView::OnViewRefresh()
{
	CTreeCtrl &treeCtl = GetTreeCtrl();

	HTREEITEM hItem = treeCtl.GetRootItem();
	CRegNode *pRootNode, *pTemp, *pTemp2, *pTemp3;
	if (hItem)
	{
		pRootNode = (CRegNode *)treeCtl.GetItemData(hItem);
		if (pRootNode)
		{					
			// delete everything under system reg keys
			// first delete tree nodes, then the node ptrs, because while deleting
			// selection change message happens
			pTemp = pRootNode->m_pFirstChild;
			while (pTemp)
			{
				pTemp2 = pTemp->m_pFirstChild;
				while (pTemp2)
				{
					pTemp3 = pTemp2;
					pTemp2 = pTemp2->m_pNextSibling;
					if (pTemp3->m_hItem)
						treeCtl.DeleteItem(pTemp3->m_hItem);
				}
				pTemp = pTemp->m_pNextSibling;
			}

			pTemp = pRootNode->m_pFirstChild;
			while (pTemp)
			{
				pTemp2 = pTemp->m_pFirstChild;
				while (pTemp2)
				{
					pTemp3 = pTemp2;
					pTemp2 = pTemp2->m_pNextSibling;
					delete pTemp3;
				}
				// reset 
				pTemp->m_pFirstChild = NULL;
				pTemp->m_bLoaded = FALSE;
				pTemp = pTemp->m_pNextSibling;
			}
			// 
			DisplayKey(pRootNode);
		}
	}
}

⌨️ 快捷键说明

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