Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Проблема с редактируемым ListView


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

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

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

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

Автор: eg13 5.8.2013, 18:23
Цитата(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;
}

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

Это не правильно. DefWindowProc - это совсем дефолтная процедура для голых окон. А у развитых окон, к коим однозначно можно отнести edit control, свои оконные процедуры, отличающиеся от DefWindowProc. Поэтому вместо DefWindowProc в своей оконной процедуре Вы должны вызывать именно оконную процедуру edit control (через http://msdn.microsoft.com/en-us/library/windows/desktop/ms633571%28v=vs.85%29.aspx), которая будет возвращена функцией SetWindowLong (и всё-таки нужна SetWindowLongPtr). Классический сабклассинг. http://www.gamedev.ru/flame/forum/?id=70557 http://www.hardforum.ru/t77275/

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)