Inplace Win32 редактирование списка всегда отменяется - PullRequest
1 голос
/ 04 июля 2010

У меня есть просмотр списка в режиме маленьких иконок в немодальном диалоговом окне Win32 с установленным LVS_EDITLABELS. Независимо от того, было ли редактирование начато с помощью щелчка мыши или программно с помощью вызова ListView_LabelEdit(), и независимо от того, была ли нажата ESC или RETURN после завершения редактирования, когда получено уведомление LVN_ENDLABELEDIT, pszText из NMLVDISPINFO всегда равно NULL, что указывает на отмененное редактирование. Возврат ИСТИНЫ из этого уведомления не имеет никакого эффекта.

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

Я подозреваю, что логика диалога по умолчанию уничтожает RETURN и отменяет редактирование, и я не знаю, как это предотвратить.

Ответы [ 3 ]

1 голос
/ 13 июля 2010

В вашем обработчике диалоговых сообщений вам нужно использовать:

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 голос
/ 11 июля 2010

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

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

У вас так же работает? Конечно, это не просто подсказка.

0 голосов
/ 14 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...