Inplace Win32 listview编辑总是被取消

时间:2010-07-04 07:53:01

标签: c++ visual-c++ listview winapi

我在设置了LVS_EDITLABELS的无模式Win32对话框中以小图标模式显示列表视图。无论是通过鼠标点击还是通过调用ListView_LabelEdit()以编程方式开始编辑,无论是否在完成编辑时命中ESC或RETURN,都会在LVN_ENDLABELEDIT收到pszText NMLVDISPINFO {{1}}时发出{{1}}始终为NULL,因此表示已取消编辑。从此通知返回TRUE无效。

我发现KB文章http://support.microsoft.com/kb/130691适用于树视图。即使是在那里找到的建议和子类化编辑控件也不起作用。

我怀疑默认对话框逻辑正在吃RETURN并取消编辑,我不知道如何防止这种情况。

3 个答案:

答案 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)

否则你会得到你观察到的行为。我不知道为什么会出现这种情况,但我怀疑编辑标签逻辑使用与IDCANCELIDOK相同的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。