
书籍:《Visual C++ 2017从入门到精通》的2.3.8 Win32控件编程 环境:visual studio 2022 内容:【例2.28】支持主项可编辑的列表视图控件 说明:以下内容大部分来自腾讯元宝。 函数原型 HWND ListView_GetEditControl(HWND hwndList);
HWND)。NULL(例如未启用标签编辑、未进入编辑模式、控件无效等)。LVS_EDITLABELS 或 LVM_SETITEMCOUNT 启用),系统会自动创建一个编辑框(通常为 CEdit 类)。LVN_BEGINLABELEDIT 消息触发时有效。ListView_GetEditControl 内部通过遍历子窗口或直接关联控件句柄返回编辑框指针。LVS_EDITLABELS 样式。
HWND hListView = CreateWindowEx(
0, WC_LISTVIEW, _T("List View"),
LVS_EDITLABELS | /* 其他样式 */, ... );ListView_SetStyle 动态启用。
ListView_SetStyle(hListView, LVS_EDITLABELS);LVN_BEGINLABELEDIT 事件:在用户开始编辑标签时调用,其他时刻可能返回无效句柄。
case LVN_BEGINLABELEDIT:
hEdit = ListView_GetEditControl(hListView); // 正确时机
break;hEdit 是否为 NULL。
hEdit = ListView_GetEditControl(hListView);
if (!hEdit) {
// 处理错误(如日志输出或返回)
return;
}ESC)或完成编辑(按回车)后被销毁。ListView_GetEditControl 仅返回主项的编辑控件句柄,子项编辑需其他方法(如自定义控件或消息处理)。LVN_BEGINLABELEDIT,并通过 iSubItem 字段判断编辑的子项,但无法直接获取子项编辑框句柄。LVN_ENDLABELEDIT 的协作LVN_ENDLABELEDIT 事件中,编辑控件已销毁,不要调用GetWindowText(hEdit, ...)。LVN_BEGINLABELEDIT 中保存原始文本,在 LVN_ENDLABELEDIT 中直接使用事件参数 pszText。
case LVN_ENDLABELEDIT:
NMLVENDLABELEDIT* pEndEdit = (NMLVENDLABELEDIT*)lParam;
if (!gbPreeEscKey) {
// 使用用户输入的文本(pEndEdit->pszText)
item.pszText = pEndEdit->pszText;
} else {
// 使用保存的原始文本(strRaw)
item.pszText = strRaw;
}
break;LVM_GETEDITCONTROL 宏(兼容性更强)。
#define ListView_GetEditControl(hwndList) // LVN_BEGINLABELEDIT 处理 case LVN_BEGINLABELEDIT: hEdit = ListView_GetEditControl(hListView); if (hEdit) { GetWindowText(hEdit, strRaw, sizeof(strRaw)); // 保存原始文本 } break; // LVN_ENDLABELEDIT 处理 case LVN_ENDLABELEDIT: NMLVENDLABELEDIT* pEndEdit = (NMLVENDLABELEDIT*)lParam; int iIndex = pEndEdit->iItem; if (!gbPreeEscKey && pEndEdit->pszText) { // 使用用户输入的文本 item.iSubItem = 0; item.pszText = pEndEdit->pszText; } else { // 恢复原始文本 item.iSubItem = 0; item.pszText = strRaw; } SendMessage(hListView, LVM_SETITEMTEXT, (WPARAM)iIndex, (LPARAM)&item); break;
NULL:LVS_EDITLABELS。LVN_BEGINLABELEDIT 中调用。gbPreeEscKey 未正确设置?检查键盘事件处理逻辑。ListView_GetEditControl 仅支持主项,子项需自定义实现。ListView_GetEditControl() 是操作列表视图标签编辑的核心函数,需严格遵循以下原则:
LVS_EDITLABELS 必不可少。LVN_BEGINLABELEDIT 中调用。LVN_ENDLABELEDIT 的 pszText 成员,避免间接访问已销毁控件。
通过合理使用该函数,可高效实现列表视图项的标签编辑与状态管理。