📄 regview.cpp
字号:
(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 + -