📄 regview.cpp
字号:
DWORD dwType)
** 功能:向列表视图插入一数据项。
** 输入:
hWnd[in]: 父窗口句柄
nCnt[in]: 插入数据项的行号索引
pszName[in]: 插入的数据
pbData[in]: 插入的数据
dwDSine[in]: pbData大小(in bytes)
dwType[in]: 插入数据项的类型
** 输出:
** 作者:XZP
** 日期:07.9.6
** 备注:根据插入数据项类型的不同,全部转化为TCHAR型
************************************************************************/
int DisplayValue(HWND hWnd,int nCnt,LPTSTR pszName,PBYTE pbData,DWORD dwDSize,DWORD dwType)
{
TCHAR szData1[20] = {0};
TCHAR szTyle[256];
int i = 0,len = 0;
TCHAR *pszData = NULL;
switch(dwType)
{
case REG_MULTI_SZ:
_tcscpy(szTyle,_T("REG_MULTI_SZ"));
pszData = (LPTSTR)pbData;
break;
case REG_EXPAND_SZ:
_tcscpy(szTyle,_T("REG_EXPAND_SZ"));
pszData = (LPTSTR)pbData;
break;
case REG_SZ:
_tcscpy(szTyle,_T("REG_SZ"));
pszData = (LPTSTR)pbData;
break;
case REG_DWORD:
_tcscpy(szTyle,_T("REG_DWORD"));
_stprintf(szData1,_T("%u"),*(UINT *)pbData);
pszData = szData1;
break;
case REG_BINARY:
_tcscpy(szTyle,_T("REG_BINARY"));
// 注意分配内存是要*sizeof(TCHAR),这句话也搞了我半天,靠
pszData = (TCHAR *)malloc((dwDSize*3+1)*sizeof(TCHAR));
if(!pszData)
{
MessageBox(hWnd,_T("no enough memory"),_T("ERROE"),MB_OK | MB_TOPMOST);
return 0;
}
pszData[0] = _T('\0');
for(i=0;i<(int)dwDSize;i++)
{
_stprintf(&pszData[3*i],_T("%02X "),pbData[i]);
}
pszData[3*i] = _T('\0');
//RETAILMSG(TRUE,(_T("i = %d, dwDSize = %d\n"),i,dwDSize));
break;
default:
_tcscpy(szTyle,_T("Unknown type"));
_stprintf(szData1,_T("Unknown type:%x"),dwType);
}
InsertLV(hWnd,nCnt,pszName,pszData,szTyle);
if(pszData && (dwType == REG_BINARY))
{
free(pszData);
}
pszData = NULL;
return 0;
}
/************************************************************************
** 函数:int PopupMenu(HWND hWnd,WORD idMenu,int nItem,int nFlag)
** 功能:创建一指定弹出式菜单(ID为idMenu的菜单的第nItem项)
** 输入:
hWnd[in]: 主窗口句柄
idMenu[in]: 菜单ID
nItem[in]: 菜单索引号
nFlag[in]: 标志位,控制弹出菜单的方向和位置
** 输出:
** 作者:XZP
** 日期:07.9.6
** 备注:TrackPopupMenu()显示一个弹出式菜单
************************************************************************/
int PopupMenu(HWND hWnd,WORD idMenu,int nItem,int nFlag)
{
POINT point;
HMENU hMenu,hSubMenu;
//MessageBox(hWnd,_T("RightButton Up"),NULL,MB_OK|MB_TOPMOST);
GetCursorPos(&point);
hMenu = LoadMenu(hInst,MAKEINTRESOURCE(idMenu));
hSubMenu = GetSubMenu(hMenu,nItem); // 取得一个弹出式菜单的句柄,它位于菜单中指定的位置
SetForegroundWindow(hWnd);
if(nFlag == 1)
{
TrackPopupMenu(hSubMenu, // 显示一个弹出式菜单
TPM_RIGHTALIGN | TPM_BOTTOMALIGN,
point.x,point.y,0,hWnd,NULL);
}
else
{
TrackPopupMenu(hSubMenu,
TPM_LEFTALIGN | TPM_TOPALIGN,
point.x,point.y,0,hWnd,NULL);
}
DestroyMenu(hMenu); // 删除菜单并释放资源
return 0;
}
/************************************************************************
** 函数:int ListVAddItem(HWND hWnd,HKEY hRoot,LPTSTR szKey,DWORD dwType)
** 功能:在指定注册表位置hKey中添加键值。
** 输入:
hWnd[in]: 主窗口句柄
hRoot[in]: 根键句柄
szKey[in]: 指定健的完整路径
dwType[in]: 新建键值类型,取以下值
REG_MULTI_SZ
REG_EXPAND_SZ
REG_SZ
REG_DWORD
REG_BINARY
** 输出:
0 - 成功;1 - 失败
** 作者:XZP
** 日期:07.9.9
** 备注:添加完了之后还要调用EnumValues刷新显示
************************************************************************/
int ListVAddItem(HWND hWnd,HKEY hRoot,LPTSTR szKey,DWORD dwType)
{
TCHAR szDefName[MAX_PATH] = {0}; // 默认的键值名
int nCnt = 0,rc,i = 1,nFlag = 1;
DWORD dwNSize,dwDSize;
TCHAR szName[256] = {0}; // 注册表健和键值的名称不能超过255个字符
BYTE bData[1024] = {0}; // 键值的数据不能超过4K
HKEY hKey;
rc = RegOpenKeyEx(hRoot,szKey,NULL,NULL,&hKey);
if(ERROR_SUCCESS != rc)
{
MessageBox(FindWindow(_T("RegView"),_T("RegView")),
_T("ListVAddItem ERR1"),_T("ERR"),
MB_OK | MB_TOPMOST | MB_ICONWARNING);
if(hKey)
RegCloseKey(hKey);
return 1;
}
// 枚举指定子键下的所有键值,查看默认的新建键值名“新值 #%d”是否存在
do
{
_stprintf(szDefName,_T("新值 #%d"),i);
dwNSize = sizeof(szName)/sizeof(TCHAR);
dwDSize = sizeof(bData)/sizeof(BYTE);
nCnt = 0;
rc = RegEnumValue(hKey,nCnt,szName,&dwNSize,
NULL,NULL,bData,&dwDSize);
while(rc == ERROR_SUCCESS)
{
if(_tcscmp(szDefName,szName) == 0)
{
i++;
break;
}
dwNSize = sizeof(szName)/sizeof(TCHAR);
dwDSize = sizeof(bData)/sizeof(BYTE);
nCnt++;
rc = RegEnumValue(hKey,nCnt,szName,&dwNSize,
NULL,NULL,bData,&dwDSize);
}
if(rc != ERROR_SUCCESS)
nFlag = 0;
} while(nFlag);
switch(dwType)
{
case REG_MULTI_SZ:
case REG_EXPAND_SZ:
case REG_SZ:
bData[0] = _T('\0');
break;
case REG_DWORD:
case REG_BINARY:
memset(bData,0,sizeof(bData));
break;
default:
break;
}
dwDSize = sizeof(bData);
if(RegSetValueEx(hKey,szDefName,NULL,dwType,bData,dwDSize) != ERROR_SUCCESS)
{
MessageBox(FindWindow(_T("RegView"),_T("RegView")),
_T("ListVAddItem ERR2"),_T("ERR"),
MB_OK | MB_TOPMOST | MB_ICONWARNING);
if(hKey)
RegCloseKey(hKey);
return 1;
}
EnumValues(hWnd,hRoot,szKey);
if(hKey)
RegCloseKey(hKey);
return 0;
}
/************************************************************************
** 函数:int ListVDeleteItem(HWND hWnd,HKEY hRoot,LPTSTR szKey)
** 功能:根据右边列表视图,删除指定健下的键值(可能不至少1个)
** 输入:
hWnd[in]: 主窗口句柄
hRoot[in]:根键句柄
szKey[in]:指定健的完整路径:
** 输出:
0 - 成功;1 - 失败
** 作者:XZP
** 日期:07.9.9
** 备注:
************************************************************************/
int ListVDeleteItem(HWND hWnd,HKEY hRoot,LPTSTR szKey)
{
int nCount = 0,i,ncbName;
UINT mask = 0;
TCHAR szName[MAX_PATH];
HWND hwndLV;
HKEY hKey = NULL;
if(ERROR_SUCCESS != RegOpenKeyEx(hRoot,szKey,NULL,NULL,&hKey))
{
MessageBox(FindWindow(_T("RegView"),_T("RegView")),
_T("ListVDeleteItem ERR1"),_T("ERR"),
MB_OK | MB_TOPMOST | MB_ICONWARNING);
if(hKey)
RegCloseKey(hKey);
return 1;
}
if(IDCANCEL == MessageBox(hWnd,_T("确实要删除此数据吗?"),_T("确认数据删除"),
MB_OKCANCEL | MB_TOPMOST | MB_ICONWARNING))
{
if(hKey)
RegCloseKey(hKey);
return 1;
}
ncbName = sizeof(szName);
hwndLV = GetDlgItem(hWnd,ID_LISTV);
nCount = ListView_GetItemCount(hwndLV);
// 注意要倒着删
for(i=nCount-1;i>=0;i--)
{
mask = ListView_GetItemState(hwndLV,i,LVIS_SELECTED);
if(mask == LVIS_SELECTED)
{
ListView_GetItemText(hwndLV,i,0,szName,ncbName);
if(ERROR_SUCCESS != RegDeleteValue(hKey,szName))
{
MessageBox(hWnd,_T("ListVDeleteItem ERR2"),_T("ERR"),
MB_OK|MB_ICONWARNING|MB_TOPMOST);
if(hKey)
RegCloseKey(hKey);
return 1;
}
}
}
EnumValues(hWnd,hRoot,szKey);
if(hKey)
RegCloseKey(hKey);
return 0;
}
/************************************************************************
** 函数:int ListVReName(HWND hWnd,HKEY hRoot,LPTSTR pszKey,LPTSTR pszName)
** 功能:重命名指定注册表子键的键值名称
** 输入:
hWnd[in]: 主窗口句柄
hRoot[in]: 键值的根键
pszKey[in]: 键值对应的子键的完整路径
pszName[in]:键值新名称
** 输出:
0 - 成功;1 - 失败
** 作者:XZP
** 日期:07.9.9
** 备注:先检索重命名键值的名称在指定健下是否已存在,存在则直接退出,重命名失败!
************************************************************************/
int ListVReName(HWND hWnd,HKEY hRoot,LPTSTR pszKey,LPTSTR pszName)
{
HKEY hKey = NULL;
int nCount = 0,i,nIndex = -1;
TCHAR szName[MAX_PATH] = {0}; // 要被改的键值名称
UINT mask;
DWORD dwType,dwcbData;
LPBYTE pbData = NULL;
HWND hwndLV = GetDlgItem(hWnd,ID_LISTV);
if(ERROR_SUCCESS != RegOpenKeyEx(hRoot,pszKey,NULL,NULL,&hKey))
{
MessageBox(hWnd,_T("ListVReName ERR1"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
if(hKey)
RegCloseKey(hKey);
return 1;
}
// 检查重命名的键值名称在指定健下是否存在,并找出被选中的的键值的
// 行索引,即要重命名的键值的行索引。
nCount = ListView_GetItemCount(hwndLV);
for(i=nCount-1;i>=0;i--)
{
ListView_GetItemText(hwndLV,i,0,szName,sizeof(szName));
if(_tcscmp(szName,pszName) == 0)
{
MessageBox(hWnd,_T("重命名失败!指定的值名已存在,输入另一名称后重试。"),
_T("重命名产生错误"),MB_ICONERROR|MB_TOPMOST|MB_OK);
if(hKey)
RegCloseKey(hKey);
return 1;
}
if(nIndex == -1) // 还没找到被选中的的键值的行索引,继续找,找到了,不再检索
{
mask = ListView_GetItemState(hwndLV,i,LVIS_SELECTED);
if(mask = LVIS_SELECTED)
nIndex = i;
}
}
ListView_GetItemText(hwndLV,nIndex,0,szName,sizeof(szName));
// 从注册表中读取要重命名的键值的相关数据:类型和数据
if(ERROR_SUCCESS == RegQueryValueEx(hKey,szName,NULL,&dwType,NULL,&dwcbData))
{
pbData = (LPBYTE)malloc(dwcbData);
if(ERROR_SUCCESS != RegQueryValueEx(hKey,szName,NULL,&dwType,pbData,&dwcbData))
{
MessageBox(hWnd,_T("ListVReName ERR2"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
if(hKey)
RegCloseKey(hKey);
return 1;
}
}
// 从注册表中删除改键值
if(ERROR_SUCCESS != RegDeleteValue(hKey,szName))
{
MessageBox(hWnd,_T("ListVReName ERR3"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
if(hKey)
RegCloseKey(hKey);
return 1;
}
// 以新键值名称建立键值
if(ERROR_SUCCESS != RegSetValueEx(hKey,pszName,NULL,dwType,pbData,sizeof(pbData)))
{
MessageBox(hWnd,_T("ListVReName ERR4"),_T("ERR"),MB_OK | MB_TOPMOST | MB_ICONWARNING);
if(hKey)
RegCloseKey(hKey);
return 1;
}
EnumValues(hWnd,hRoot,pszKey);
if(hKey)
RegCloseKey(hKey);
return 0;
}
/************************************************************************
** 函数:int ListVModifyValue(HWND hWnd,
HKEY hRoot,
LPTSTR pszKey,
LPTSTR pszName,
LPBYTE pbData)
** 功能:修改指定键值的数据
** 输入:
hWnd[in]: 主窗口句柄
hRoot[in]: 键值的根键
pszKey[in]: 键值对应的子键的完整路径
pszName[in]:要修改的键值名称
pbData[in]: 修改后的键值数据值
** 输出:
0 - 成功;1 - 失败
** 作者:XZP
** 日期:07.9.11
** 备注:
************************************************************************/
int ListVModifyValue(HWND hWnd,HKEY hRoot,LPTSTR pszKey,LPTSTR pszName,LPBYTE pbData)
{
HKEY hKey;
DWORD dwType;
if(ERROR_SUCCESS != RegOpenKeyEx(hRoot,pszKey,NULL,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -