Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2013, 16:10   #1
Jtt
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 12
По умолчанию Проблема с редактируемым ListView

Видел много тем про редактируемый ListView на форуме, но решения своей проблемы не нашел.

А проблема вот в чем. При клике по определенной ячейке в ListView создаю edit control. Все бы хорошо, но когда я устанавливаю для edit'a свою оконную процедуру, то он перестает отображаться. Точнее сказать, отображается под таблицей. А как отобразить его сверху ума не приложу. Если не устанавливать свою функцию обработки для edit'a, то он рисуется сверху ListView. Но если процедуру не устанавливать, не знаю как WM_KILLFOCUS ловить. Такие дела.
Вот кусочек кода:
Код:
case LVN_ITEMACTIVATE:
      {
        if(((LPNMITEMACTIVATE)lParam)->iSubItem==28){//если ячейка находится в 28ом столбце
             ListView_GetSubItemRect(hList,((LPNMITEMACTIVATE)lParam)->iItem, ((LPNMITEMACTIVATE)lParam)->iSubItem,LVIR_BOUNDS, &lpRect);//получаем координаты ячейки
             ListView_GetItemText(hList, ((LPNMITEMACTIVATE)lParam)->iItem, 28, buf, 255);  //копируем текст из ячейки таблицы в буфер              
             hEdit=CreateWindow( L"edit", buf, WS_CHILD|WS_CLIPSIBLINGS|WS_BORDER|ES_LEFT|WS_VISIBLE, lpRect.left,lpRect.top,
                                          lpRect.right-lpRect.left,lpRect.bottom-lpRect.top, hList,(HMENU)ID_EDIT, hInst, NULL);
             SetWindowLong(hEdit,GWL_WNDPROC,(LONG)WndProc2); //устанавливаем оконную процедуру
             SetFocus(hEdit); //устанавливаем фокус
        }
      }
Буду очень благодарен за любую помощь!

Последний раз редактировалось Jtt; 05.08.2013 в 00:24.
Jtt вне форума Ответить с цитированием
Старый 04.08.2013, 16:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я может не в тему скажу, но я лично предпочитаю упрощать подобного рода задачу: При клике по ячейке Листа открывается модальное окно с эдитом, куда и вводится редактируемая из ячейки инфа. ИМХО так проще и надежнее.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.08.2013, 20:54   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Jtt Посмотреть сообщение
Если не устанавливать свою функцию обработки для edit'a, то он рисуется сверху ListView.
Ну, явно ключ в процедуре окна - покажите процедуру окна, которую ставите...
waleri вне форума Ответить с цитированием
Старый 05.08.2013, 00:18   #4
Jtt
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 12
По умолчанию

Код:
    LRESULT CALLBACK WndProc2(HWND hWndEdit, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
           case WM_KILLFOCUS:
            {
                DestroyWindow(hWndEdit);
            }; break;
            default: return DefWindowProc(hWndEdit, msg, wParam, lParam);
        }
        return 0l;
    }
Потеря фокуса определяется как надо, но вот эдитконрол никак не хочет отображаться

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я может не в тему скажу, но я лично предпочитаю упрощать подобного рода задачу: При клике по ячейке Листа открывается модальное окно с эдитом, куда и вводится редактируемая из ячейки инфа. ИМХО так проще и надежнее.
Я изначально так и сделал, но нужно обойтись без новых окон)

Последний раз редактировалось Stilet; 05.08.2013 в 08:17.
Jtt вне форума Ответить с цитированием
Старый 05.08.2013, 00:52   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Попробуй SetWindowPos со вторым параметром задающим нужную позицию в Z-последовательности
counter вне форума Ответить с цитированием
Старый 05.08.2013, 19:16   #6
Jtt
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
Попробуй SetWindowPos со вторым параметром задающим нужную позицию в Z-последовательности
Пробовал, но эдит так и не нарисовался сверху
Jtt вне форума Ответить с цитированием
Старый 05.08.2013, 22:10   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А если сначала сделать SetFocus а потом менять процедуру окна?
А если закоментировать вызов DestroyWindow?
Кроме того, в обычном диалоге если сделать edit box и поменять ему процедуру будет рисоваться? А то в вашей процедуре окна отрисовки нет - кто его знает, что делает DefWindowProc...
waleri вне форума Ответить с цитированием
Старый 06.08.2013, 14:48   #8
Jtt
Пользователь
 
Регистрация: 05.07.2011
Сообщений: 12
Радость

Всем спасибо за участие, вопрос решен
Проблема была в этом
Код:
default: return DefWindowProc(hWndEdit, msg, wParam, lParam);
Заменил на это:
Код:
default: return CallWindowProc(EdOldWndProc,hWndEedit,msg,wParam,lParam);
где EdOldWndProc - это то, что возвращает функция SetWindowLong(hEdit,GWL_WNDPROC,(LO NG)WndProc2);
Jtt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с прокруткой в ListView NaumOff Компоненты Delphi 6 25.09.2012 13:36
Проблема с ListView Saumavalion Win Api 4 06.05.2012 16:02
Небольшая проблема с ListView mixer94 Компоненты Delphi 5 12.08.2009 09:08
проблема с listbox и listview. blackstersl Общие вопросы Delphi 3 06.05.2009 23:31
Проблема с ListView mar4elo Общие вопросы Delphi 5 04.12.2008 14:48