Проблема с редактируемым ListView

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
eg__13
Сообщения: 4
Зарегистрирован: 04 авг 2013, 16:20

04 авг 2013, 16:22

Видел много тем про редактируемый 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); //устанавливаем фокус
        }
      }
Буду очень благодарен за любую помощь!
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

05 авг 2013, 18:44

Приведите текст вашей оконной процедуры для edit control'а.
eg__13
Сообщения: 4
Зарегистрирован: 04 авг 2013, 16:20

05 авг 2013, 19:00

Eugie писал(а):Приведите текст вашей оконной процедуры для edit control'а.

Код: Выделить всё

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;
    }
Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

05 авг 2013, 22:35

При сабклассинге необходимо все сообщения после вашей обработки перенаправлять в старую оконную процедуру. Ваша оконная процедура будет выглядеть примерно так:

Код: Выделить всё

// При установке новой оконной процедуры надо сохранить указатель на старую.
WNDPROC wpOrigProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG_PTR)WndProc2);
...
LRESULT CALLBACK WndProc2(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_KILLFOCUS:
        {
             DestroyWindow(hWnd);
        }; break;
    }
    // После вашей обработки надо передать управление в старую ОП
    return CallWindowProc(wpOrigProc, hWnd, msg, wParam, lParam);
}
Ответить