2010-07-04 3 views
1

У меня есть список в режиме небольших значков на немодальном диалоговом окне Win32 с набором LVS_EDITLABELS. Независимо от того, было ли редактирование начато щелчком мыши или программным путем путем вызова ListView_LabelEdit() и независимо от того, был ли нажат ESC или RETURN после завершения редактирования, когда получено уведомление LVN_ENDLABELEDITpszText из NMLVDISPINFO всегда равно NULL, что указывает на отмененное редактирование. Возврат TRUE из этого уведомления не влияет.Inplace Редактирование списка окон Win32 всегда отменяется

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

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

+0

Звучит правдоподобно. Реализовать обработчик WM_GETDLGCODE сообщение в диалоговом окне процедуры. –

+0

К сожалению, я не упомянул, я уже сделал это слишком Я реализовал обработчик как в диалоговом окне, так и в элементе управления. – wpfwannabe

ответ

1

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

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

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

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.

0

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

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

Смежные вопросы