Оперативный Win32 listview редактирование всегда отменяется

У меня есть listview в небольшом режиме значков на немодальном диалоговом окне Win32 с LVS_EDITLABELS набор. Независимо от того, было ли редактирование начато щелчком мышью или программно путем вызова ListView_LabelEdit() и независимо от или ESC или ВОЗВРАТ был поражен после окончания редактирования, когда LVN_ENDLABELEDIT уведомление получено pszText из NMLVDISPINFO является всегда ПУСТЫМ, таким образом указывая на отмененное редактирование. Возвращение TRUE из этого уведомления не имеет никакого эффекта.

Я нашел статью KB http://support.microsoft.com/kb/130691, который относится к treeview. Даже следование совету, найденному там и разделение на подклассы средств редактирования, не работали.

Я подозреваю, что диалоговая логика по умолчанию съедает ВОЗВРАТ и отменяет редактирование, и я понятия не имею, как предотвратить это.

1
задан wpfwannabe 4 July 2010 в 07:53
поделиться

3 ответа

LVN_ENDLABELEDIT отлично работает у меня и возвращает правильный текст. Проблема в том, что при нажатии RETURN или ESC диалоговое окно обрабатывает его как IDOK или IDCANCEL и закрывает диалоговое окно, отменяя метку редактирования. Итак, если вы прокомментируете эти строки кода, вы получите правильный текст:

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
}

Это работает и для вас? Конечно, это не решение, а подсказка.

1
ответ дан 2 September 2019 в 23:18
поделиться

Хорошо, спасибо всем вам за участие. После многих часов отладки выяснилось, что проблема в том, что код подкласса съедает все сообщения WM_NOTIFY и WM_COMMAND, не передавая их подклассифицированной процедуре. Я не использую ни MFC, ни ATL, а только свои собственные обертки. Как только я начал делегировать WM_COMMAND и WM_NOTIFY, все автоматически начало работать, как и ожидалось.

Так что это была моя собственная ошибка :( Тем не менее, +1 всем за попытку.

0
ответ дан 2 September 2019 в 23:18
поделиться

В обработчике диалогового сообщения вам необходимо использовать:

COMMAND_HANDLER(IDCANCEL, 0, OnCancel)
COMMAND_HANDLER(IDOK, 0, OnOK)

в противном случае вы получите поведение, которое вы наблюдали. Я понятия не имею, почему это так, но подозреваю, что логика метки редактирования использует те же идентификаторы, что и IDCANCEL и IDOK , но использует код уведомления, определенный элементом управления согласно ] http://msdn.microsoft.com/en-us/library/ms647591%28VS.85%29.aspx .

1
ответ дан 2 September 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: