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

📄 regview.cpp

📁 ce系统下面的一个浏览注册表的应用程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					(HMENU)ID_EDIT,	// ID
					NULL,NULL);		//
			hwndEdit = GetDlgItem(hwndCtl,ID_EDIT);
			ListView_GetItemText(hwndCtl,nItem,nSubItem,szText,sizeof(szText));
			SetWindowText(hwndEdit,(LPCTSTR)szText);
			SendMessage(hwndEdit,EM_SETSEL,0,-1);
			SetForegroundWindow(hwndEdit);
			ShowWindow(hwndEdit,SW_SHOW);	
			SetFocus(hwndEdit);
		}
		else
		{
			MoveWindow(hwndEdit,
						rect.left,
						rect.top,
						rect.right - rect.left,
						rect.bottom - rect.top,
						FALSE);
			ListView_GetItemText(hwndCtl,nItem,nSubItem,szText,sizeof(szText));
			SetWindowText(hwndEdit,(LPCTSTR)szText);
			SendMessage(hwndEdit,EM_SETSEL,0,-1);
			ShowWindow(hwndEdit,SW_SHOW);
			SetForegroundWindow(hwndEdit);
			SetFocus(hwndEdit);
			//MessageBox(hWnd,_T("OK"),NULL,MB_OK);
		}*/
		/*
		GetCursorPos(&point);				// 获得当前鼠标位置
		ScreenToClient(hwndCtl,&point);		// 坐标转换,不转换将出现坐标混乱现象
		memset(&lvhti,0,sizeof(lvhti));
		lvhti.pt = point;
		// 测试鼠标当前选中的ITEM和SUBITEM
		nItem = ListView_SubItemHitTest(hwndCtl,&lvhti);
		if(nItem == -1)
			return 1;
		nItem = lvhti.iItem;
		nSubItem = lvhti.iSubItem;
		*/
		// 确保只在选中1项的情况下在允许重命名
		nCount = ListView_GetSelectedCount(hwndCtl);
		if(nCount == 1)
			//DialogBox(hInst,MAKEINTRESOURCE(IDD_MODIFY),hWnd,(DLGPROC)ModifyDlgProc);
			DialogBox(hInst,MAKEINTRESOURCE(IDD_MODIFY1),hWnd,(DLGPROC)ModifyDlgProc);
		return 0;

	case LVN_COLUMNCLICK:			// 单击列表头
		
		pnmv = (LPNMLISTVIEW)pnmh;
		lParamSort = (LPARAM)pnmv->iSubItem;
		g_bSortFlag = !g_bSortFlag;
		ListView_SortItems(hwndCtl,(PFNLVCOMPARE)CompareFunc,lParamSort);
		return 0;

	default:
		break;
	}
	return 0;
}

/************************************************************************
** 函数:LPARAM DoMainNotifyTreeV(HWND hWnd,
								  WORD idItem,
								  HWND hwndCtl,
								  LPNMHDR pnmh)
** 输入:
** 输出:
** 功能:注册表左边的树形视图的通知消息响应函数。
** 作者:XZP
** 日期:07.9.5
** 备注:树型视图用消息来完成通信。 父窗口发送一系列的消息给树型视图,而
树型视图发送"notification"消息给它的父窗口。在这方面,树型视图和其它的通
用控制没什么两样。树型视图发送给父窗口的通知消息以TVN_打头。树型视图接收
到的消息以TVM_打头。父窗口发送TVM_消息来控制树型视图。
************************************************************************/
LPARAM DoMainNotifyTreeV(HWND hWnd,WORD idItem,HWND hwndCtl,LPNMHDR pnmh)
{
	LPNM_TREEVIEW pNotifyTV;		// 与树形视图消息相关的结构体
	TCHAR szKey[256];				// 树型视图中某一结点的完整路径
	HKEY hRoot = NULL,hKey = NULL;	
	HTREEITEM hChild = NULL,hNext = NULL,hItem = NULL,hParent = NULL;
	TVITEM tvItem;
	static TCHAR szBeginText[256] = {0},szEndText[256] = {0};
	int i;
	static HWND hEdit;				// 编辑树型视图结点时的编辑框句柄

	pNotifyTV = (LPNM_TREEVIEW)pnmh;
	switch(pnmh->code)
	{
/*	case NM_DBLCLK:
		MessageBox(hWnd,_T("NM_DBLCLK"),NULL,MB_OK);
		break;
*/
	case NM_CLICK:
		// 清除所有选中标志和高亮标志,结点句柄传递0即可。
		TreeView_SelectDropTarget(GetDlgItem(hWnd,ID_TREEV),0);
		TreeView_SelectItem(GetDlgItem(hWnd,ID_TREEV),0);

		// 选中并高亮显示单击的目标结点
		if(pNotifyTV->itemNew.hItem)
		{
			//TreeView_EnsureVisible(GetDlgItem(hWnd,ID_TREEV),pNotifyTV->itemNew.hItem);
			//TreeView_SelectDropTarget(hwndCtl,pNotifyTV->itemNew.hItem);
			//TreeView_Select(hwndCtl,pNotifyTV->itemNew.hItem,TVGN_CARET);
			//TreeView_SelectItem(GetDlgItem(hWnd,ID_TREEV),pNotifyTV->itemNew.hItem);
		}
		break;
/*	case NM_RETURN:
		MessageBox(hWnd,_T("NM_RETURN"),NULL,MB_OK);
		break;
	case NM_RDBLCLK:
		MessageBox(hWnd,_T("NM_RDBLCLK"),NULL,MB_OK);
		break;
*/
	case NM_RCLICK:
		MessageBox(hWnd,_T("OK"),NULL,MB_OK);
		break;

	case TVN_ITEMEXPANDED:			// 某节点被展开或者卷起后发送
		if(pNotifyTV->action == TVE_COLLAPSE)
		{// 某结点被折叠
		 // 删除其所有子结点,若不删除,没次点击"+"便插入子结点,会重复子结点
			
			// 获得第一个子结点句柄(两种方法)
			/*
			hChild = TreeView_GetChild(		
				hwndCtl,					// 树型控件句柄
				pNotifyTV->itemNew.hItem);	// 结点句柄
			*/
			hChild = (HTREEITEM)SendMessage(GetDlgItem(hWnd,ID_TREEV),
										TVM_GETNEXTITEM,
										TVGN_CHILD,
										(LPARAM)pNotifyTV->itemNew.hItem);
				
			while(hChild)
			{
				// 获得下一兄弟结点(两种方法)
				/*
				hNext = TreeView_GetNextItem( 
					hwndCtl,				// 树型控件句柄
					hChild,					// 结点句柄
					TVGN_NEXT);				// 指明结点的下一兄弟结点
				*/
				hNext =(HTREEITEM)SendMessage(GetDlgItem(hWnd,ID_TREEV),
										TVM_GETNEXTITEM,
										TVGN_NEXT,
										(LPARAM)hChild);

				// 删除子结点
				TreeView_DeleteItem(hwndCtl,hChild);
				hChild = hNext;
			}
			
		}
		break;
	case TVN_SELCHANGED:					// 某结点被选中
		// 获取一树型视图结点的完整路径及其根结点句柄
		GetTree(hWnd,pNotifyTV->itemNew.hItem,
			&hRoot,szKey,sizeof(szKey)/sizeof(TCHAR));
		g_hRoot = hRoot;
		_tcscpy(g_szKey,szKey);
		EnumValues(hWnd,hRoot,szKey);
		return 0;
	case TVN_ITEMEXPANDING:					// 某结点将要被展开或者折叠前发送
		if(pNotifyTV->action = TVE_EXPAND)
		{// 某结点即将展开。
			GetTree(hWnd,pNotifyTV->itemNew.hItem,
				&hRoot,szKey,sizeof(szKey)/sizeof(TCHAR));
//			MessageBox(hWnd,szKey,NULL,MB_OK);
			i = EnumChildren(hWnd,pNotifyTV->itemNew.hItem,hRoot,szKey);
		}
		return 0;
	case TVN_BEGINLABELEDIT:				// 编辑树型视图结点开始
		hEdit = TreeView_GetEditControl(hwndCtl);
		GetWindowText(hEdit,szBeginText,sizeof(szBeginText)/sizeof(TCHAR));
		RETAILMSG(1,(_T("TVN_BEGINLABELEDIT hEdit: %0xX\n"),hEdit));
		return 0;
	case TVN_ENDLABELEDIT:					// 编辑树型视图结点结束
		RETAILMSG(1,(_T("TVN_ENDLABELEDIT hEdit: %0xX\n"),hEdit));
		hItem = TreeView_GetSelection(hwndCtl);
		GetWindowText(hEdit,szEndText,sizeof(szEndText)/sizeof(TCHAR));
		// 如果新名是空或者没有改变,直接return
		if( (_tcscmp(szEndText,_T(""))==0) || (_tcscmp(szEndText,szBeginText)==0) )
		{
			MessageBox(hWnd,_T("name is null or no modify"),NULL,MB_OK);
			return 0;
		}
		memset(&tvItem,0,sizeof(tvItem));
		tvItem.mask = TVIF_TEXT;
		tvItem.hItem = hItem;
		tvItem.pszText = szEndText;
		tvItem.cchTextMax = sizeof(szEndText)/sizeof(TCHAR);
		TreeView_SetItem(hwndCtl,&tvItem);
		
		// 得到父结点在注册表中的完整路径
		hParent = TreeView_GetParent(hwndCtl,hItem);
		GetTree(hWnd,hParent,&hRoot,szKey,sizeof(szKey)/sizeof(TCHAR));
		if(ERROR_SUCCESS == RegOpenKeyEx(hRoot,szKey,NULL,NULL,&hKey))
		{
			RegReName(hKey,hKey,szBeginText,szEndText);
		}
		return 0;
	}
	
	return 0;
}

/************************************************************************
** 函数:LRESULT DoDestroyMain(HWND hWnd,
							   UINT wMsg,
							   WPARAM wParam,
							   LPARAM lParam)
** 输入:
** 输出:
** 功能:WM_DESTROY消息的响应函数。
** 作者:XZP
** 日期:07.9.5
** 备注:通过PostQuitMessage(0)函数来退出程序。其中0为WinMain函数的返回值。
************************************************************************/
LRESULT DoDestroyMain(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam)
{
	
	PostQuitMessage(0);
	return 0;
}

/************************************************************************
** 函数:HWND CreateTV(HWND hWnd,RECT *prect)
** 输入:
		hWnd[in]:父窗口句柄
		prect[in]:窗口位置
** 输出:
		HWND[out]:成功:树型视图控件句柄;失败:0
** 功能:在指定方块(命令栏下,客户区右边)中创建一树型视图控件
** 作者:XZP
** 日期:07.9.3
** 备注:调用CreateWindowEx函数和传递窗口类名WC_TREEVIEW来创建树形视图控件
************************************************************************/
HWND CreateTV(HWND hWnd,RECT *prect)
{
	HBITMAP hBmp1,hBmp2;
	HIMAGELIST himl;
	HWND hwndTV;

	// 创建树型控件
	hwndTV = CreateWindowEx(0,WC_TREEVIEW,			// 传递类名WC_TREEVIEW
		                    TEXT(""),WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_BORDER | WS_HSCROLL |
							TVS_HASLINES |			// 在父项目中显示+或-
							TVS_HASBUTTONS |		// 在根目录下也有+或-符号
							TVS_LINESATROOT|		// 在层次中用线条来连接各个项目名称
							TVS_EDITLABELS,			// 标签可编辑
							//TVS_SINGLEEXPAND ,	// 单击展开结点并折叠起已展开的
							prect->left,prect->top,	// 树型视图控件位置
							prect->right,prect->bottom,
							hWnd,					// 父窗口句柄
							(HMENU)ID_TREEV,		// 树型控件ID
							hInst,					// 父窗口实例句柄
							NULL);
	if(!IsWindow(hwndTV))
		return 0;

	// 创建图象链表
	himl = ImageList_Create(16,16,					// 图象尺寸
		                    ILC_COLOR,				// 图象格式
							2,						// 图象列表里的初始图象数量
							2);						// 要添加的图象个数
	
	// 装载位图
	//HICON hicon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
	hBmp1 = LoadBitmap(hInst,MAKEINTRESOURCE(ID_BMPS));
	hBmp2 = LoadBitmap(hInst,MAKEINTRESOURCE(ID_BMPS2));
	// 添加位图到图象列表
	ImageList_Add(himl,hBmp1,NULL);
	ImageList_Add(himl,hBmp2,NULL);
	//ImageList_ReplaceIcon(himl,1,hicon);
	
	// 位图被装进图象列表后,应该删除位图。
	DeleteObject(hBmp1);
	DeleteObject(hBmp2);
	//DeleteObject(hicon);

	// 图象列表与树型视图相关联
	TreeView_SetImageList(hwndTV,himl,TVSIL_NORMAL);
	
	return hwndTV;
}

/************************************************************************
** 函数:HWND CreateLV(HWND hWnd,RECT *prect)
** 输入:
		hWnd[in]:	父窗口句柄
		prect[in]:	窗口位置
** 输出:
		HWND[out]:	成功:列表视图控件句柄;失败:0
** 功能:在指定方块(命令栏下,客户区左边)中创建一列表视图控件
** 作者:XZP
** 日期:07.9.3
** 备注:调用CreateWindowEx函数和传递窗口类名WC_LISTVIEW来创建列表视图
************************************************************************/
HWND CreateLV(HWND hWnd,RECT *prect)
{
	HWND hwndLV;
	LVCOLUMN lvc;
	HBITMAP hBmp1,hBmp2,hBmp3,hBmp4;

	// 创建报告式列表视图控件
	hwndLV = CreateWindowEx(0,
							WC_LISTVIEW,_T(""),				// 传递窗口类名WC_LISTVIEW
							WS_VISIBLE|WS_CHILD|WS_VSCROLL|	WS_BORDER |
							LVS_REPORT,						// report样式
							//LVS_SORTASCENDING,				// 按字符升序排列
							prect->left,prect->top,			// 窗口位置及大小
							prect->right,
							prect->bottom,
							hWnd,(HMENU)ID_LISTV,hInst,NULL);

	// 设置列表控件扩展风格
/*	DWORD styles= LVS_EX_FULLROWSELECT		// FullRowSelect完全行
				| LVS_EX_HEADERDRAGDROP;	// 允许拖拽
	ListView_SetExtendedListViewStyleEx(GetDlgItem(hWnd,ID_LISTV),styles,styles);
*/
	// 关联图像列表
	HIMAGELIST himl = ImageList_Create(16,16,				// 图像大小
										ILC_COLOR4,			// 图象格式
										5,					// 图象列表里的初始图象数量
										0);					// 图象数量的可增加值
	// 装载位图
	hBmp1 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_M));		// REG_MULTI_SZ图标
	hBmp2 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_AB));		// REG_EXPAND_SZ、REG_SZ图标
	hBmp3 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_D));		// REG_DWORD图标
	hBmp4 = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_B));		// REG_BINARY图标
	// 将位图添加到图像列表	
	ImageList_Add(himl,hBmp1,NULL);
	ImageList_Add(himl,hBmp2,NULL);
	ImageList_Add(himl,hBmp3,NULL);
	ImageList_Add(himl,hBmp4,NULL);
	// 位图被装进图象列表后,应该删除位图。
	DeleteObject(hBmp1);
	DeleteObject(hBmp2);
	DeleteObject(hBmp3);
	DeleteObject(hBmp4);
	
	ListView_SetImageList(hwndLV,himl,LVSIL_SMALL);

	// 添加表头
	if(hwndLV)
	{
		lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT | LVCF_SUBITEM | LVCF_ORDER;
		lvc.fmt = LVCFMT_LEFT;			// 左对齐
		lvc.cx = 120;					// 列宽
		lvc.pszText = _T("Name");
		lvc.iOrder = 0;
		lvc.iSubItem = 0;
		SendMessage(hwndLV,LVM_INSERTCOLUMN,0,(LPARAM)&lvc);

		lvc.mask |= LVCF_SUBITEM;
		lvc.pszText = _T("Data");
		lvc.cx = 250;
		lvc.iOrder = 1;
		lvc.iSubItem = 1;
		SendMessage(hwndLV,LVM_INSERTCOLUMN,1,(LPARAM)&lvc);
		
		lvc.mask |= LVCF_SUBITEM;
		lvc.pszText = _T("Type");
		lvc.cx = 120;
		lvc.iOrder = 2;
		lvc.iSubItem = 2;
		SendMessage(hwndLV,LVM_INSERTCOLUMN,2,(LPARAM)&lvc);
	}
	return hwndLV;
}

/************************************************************************
** 函数:int InsertLV(HWND hWnd,
					  int nItem,
					  LPTSTR pszName,
					  LPTSTR pszData,
					  LPTSTR pszType)
** 功能:向列表视图插入数据				
** 输入:
		hWnd[in]:	父窗口句柄
		nItem[in]:	要插入数据的行索引号
		pszName[in]:要插入的数据
		pszData[in]:要插入的数据
		pszType[in]:数据类型
** 输出:		
** 作者:XZP
** 日期:07.9.6
** 备注:通过SendMessage发送LVM_INSERTITEM和LVM_SETITEM向列表视图控件添加数据项
************************************************************************/
int InsertLV(HWND hWnd,int nItem,LPTSTR pszName,LPTSTR pszData,LPTSTR pszType)
{
	LVITEM lvi;
	int rc;
	HWND hwndLV = GetDlgItem(hWnd,ID_LISTV);

	memset(&lvi,0,sizeof(LVITEM));
	// 插入数据项先
	lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
	lvi.iItem = nItem;
	lvi.iSubItem = 0;
	lvi.pszText = pszName;
	lvi.lParam = nItem;
	
	// 设置图标
	if( _tcscmp(pszType,_T("REG_MULTI_SZ")) == 0) 
		lvi.iImage = 0;
	else if( (_tcscmp(pszType,_T("REG_EXPAND_SZ")) == 0) ||
			 (_tcscmp(pszType,_T("REG_SZ")) == 0) )
		lvi.iImage = 1;
	else if(_tcscmp(pszType,_T("REG_DWORD")) == 0)

⌨️ 快捷键说明

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