У меня есть listview в небольшом режиме значков на немодальном диалоговом окне Win32 с LVS_EDITLABELS
набор. Независимо от того, было ли редактирование начато щелчком мышью или программно путем вызова ListView_LabelEdit()
и независимо от или ESC или ВОЗВРАТ был поражен после окончания редактирования, когда LVN_ENDLABELEDIT
уведомление получено pszText
из NMLVDISPINFO
является всегда ПУСТЫМ, таким образом указывая на отмененное редактирование. Возвращение TRUE из этого уведомления не имеет никакого эффекта.
Я нашел статью KB http://support.microsoft.com/kb/130691, который относится к treeview. Даже следование совету, найденному там и разделение на подклассы средств редактирования, не работали.
Я подозреваю, что диалоговая логика по умолчанию съедает ВОЗВРАТ и отменяет редактирование, и я понятия не имею, как предотвратить это.
LVN_ENDLABELEDIT отлично работает у меня и возвращает правильный текст. Проблема в том, что при нажатии RETURN или ESC диалоговое окно обрабатывает его как IDOK или IDCANCEL и закрывает диалоговое окно, отменяя метку редактирования. Итак, если вы прокомментируете эти строки кода, вы получите правильный текст:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
Это работает и для вас? Конечно, это не решение, а подсказка.
Хорошо, спасибо всем вам за участие. После многих часов отладки выяснилось, что проблема в том, что код подкласса съедает все сообщения WM_NOTIFY и WM_COMMAND, не передавая их подклассифицированной процедуре. Я не использую ни MFC, ни ATL, а только свои собственные обертки. Как только я начал делегировать WM_COMMAND и WM_NOTIFY, все автоматически начало работать, как и ожидалось.
Так что это была моя собственная ошибка :( Тем не менее, +1 всем за попытку.
В обработчике диалогового сообщения вам необходимо использовать:
COMMAND_HANDLER(IDCANCEL, 0, OnCancel)
COMMAND_HANDLER(IDOK, 0, OnOK)
в противном случае вы получите поведение, которое вы наблюдали. Я понятия не имею, почему это так, но подозреваю, что логика метки редактирования использует те же идентификаторы, что и IDCANCEL
и IDOK
, но использует код уведомления, определенный элементом управления согласно ] http://msdn.microsoft.com/en-us/library/ms647591%28VS.85%29.aspx .