Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с редактируемым ListView 
V
    Опции темы
eg13
Дата 4.8.2013, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.8.2013

Репутация: нет
Всего: нет



Видел много тем про редактируемый 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); //устанавливаем фокус
        }
      }

Буду очень благодарен за любую помощь! 

Это сообщение отредактировал(а) GremlinProg - 5.8.2013, 07:31
PM MAIL   Вверх
feodorv
Дата 4.8.2013, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(eg13 @  4.8.2013,  16:40 Найти цитируемый пост)
             SetWindowLong(hEdit,GWL_WNDPROC,(LONG)WndProc2); //устанавливаем оконную процедуру

Тааак. А куда Вы дели старую оконную функцию, которую возвращает SetWindowLong? Её же потом вызывать нужно из новой  smile 
И пользуйтесь, пожалуйста, SetWindowLongPtr, а то мало ли чего...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
eg13
Дата 5.8.2013, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.8.2013

Репутация: нет
Всего: нет



Цитата(feodorv @ 4.8.2013,  21:17)
Цитата(eg13 @  4.8.2013,  16:40 Найти цитируемый пост)
             SetWindowLong(hEdit,GWL_WNDPROC,(LONG)WndProc2); //устанавливаем оконную процедуру

Тааак. А куда Вы дели старую оконную функцию, которую возвращает SetWindowLong? Её же потом вызывать нужно из новой  smile 
И пользуйтесь, пожалуйста, SetWindowLongPtr, а то мало ли чего...

А с этого места можно поподробнее?) smile  

Вот моя  оконная процедура, которую я устанавливаю для эдита:
Код

LRESULT CALLBACK WndProc2(HWND hWndE, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
       case WM_KILLFOCUS:
        {
            MessageBox(NULL,L"Фокус потерян",L"ыыыы", MB_OK);
        }; break;
        default: return DefWindowProc(hWndE, msg, wParam, lParam);
    }
    return 0l;
}

PM MAIL   Вверх
feodorv
Дата 6.8.2013, 02:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(eg13 @  5.8.2013,  19:23 Найти цитируемый пост)
        default: return DefWindowProc(hWndE, msg, wParam, lParam);

Это не правильно. DefWindowProc - это совсем дефолтная процедура для голых окон. А у развитых окон, к коим однозначно можно отнести edit control, свои оконные процедуры, отличающиеся от DefWindowProc. Поэтому вместо DefWindowProc в своей оконной процедуре Вы должны вызывать именно оконную процедуру edit control (через CallWindowProc), которая будет возвращена функцией SetWindowLong (и всё-таки нужна SetWindowLongPtr). Классический сабклассинг. Пример. И тот же вопрос с теми же ответами.

Это сообщение отредактировал(а) feodorv - 6.8.2013, 03:00


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
eg13
Дата 6.8.2013, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.8.2013

Репутация: нет
Всего: нет



feodorv, у меня нет слов чтобы выразить свою благодарность! Все заработало как нужно! smile 

Это сообщение отредактировал(а) eg13 - 6.8.2013, 11:28
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.