我在设置了LVS_EDITLABELS
的无模式Win32对话框中以小图标模式显示列表视图。无论是通过鼠标点击还是通过调用ListView_LabelEdit()
以编程方式开始编辑,无论是否在完成编辑时命中ESC或RETURN,都会在LVN_ENDLABELEDIT
收到pszText
NMLVDISPINFO
{{1}}时发出{{1}}始终为NULL,因此表示已取消编辑。从此通知返回TRUE无效。
我发现KB文章http://support.microsoft.com/kb/130691适用于树视图。即使是在那里找到的建议和子类化编辑控件也不起作用。
我怀疑默认对话框逻辑正在吃RETURN并取消编辑,我不知道如何防止这种情况。
答案 0 :(得分:1)
LVN_ENDLABELEDIT可以正常使用并返回正确的文本。问题是,当您按RETURN或ESC对话框将其处理为IDOK或IDCANCEL并关闭取消编辑标签的对话框。 因此,如果您对这些代码行进行注释,您将获得正确的文本:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
它对你有效吗? 对于cource来说,这不仅仅是一个解决方案。
答案 1 :(得分:1)
在对话框消息处理程序中,您需要使用:
COMMAND_HANDLER(IDCANCEL, 0, OnCancel)
COMMAND_HANDLER(IDOK, 0, OnOK)
否则你会得到你观察到的行为。我不知道为什么会出现这种情况,但我怀疑编辑标签逻辑使用与IDCANCEL
和IDOK
相同的ID,但是根据http://msdn.microsoft.com/en-us/library/ms647591%28VS.85%29.aspx使用控件定义的通知代码。
答案 2 :(得分:0)
好的,谢谢你们所有人的贡献。经过几个小时的调试后发现,子类代码吞噬了所有WM_NOTIFY和WM_COMMAND消息,而没有将它们委托给子类程序。我既不使用MFC也不使用ATL,而是使用我自己的包装器。一旦我开始委派WM_COMMAND和WM_NOTIFY,它就会自动开始按预期工作。
所以,这是我自己的错:(尽管如此,所有人都尝试+1。