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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Редактирование ячеек в TreeView, Какая-то хрень 
V
    Опции темы
0x07L
Дата 17.6.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

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



Есть обычное OVERLAPPED окно. В нем есть TreeView, созданный со стилем TVS_EDITLABELS. Добавляю туда item. Хочу его отредактровать. Щелкаю два раза мышкой на нем. Все нормально: появилась рамка, каретка приехала, куда надо, текст выделился. Вот только собственно отредактировать текст не получается. Не работают символьные (или как они называются) клавиши. Стрелки работают: каретка двигается. Работает, слава Богу, и Del. А вот буквы, цифры, пробелы вставлять, а также использовать Backspace не получается (ничего не происходит). Редактирование заканчивается по Enter, как и должно быть.

Никаких TVN_KEYDOWN я не обрабатываю.

Код

#include <windows.h>
#include <tchar.h>
#include <commctrl.h>

#pragma comment (lib, "ComCtl32.Lib")

int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int CmdShow);
LRESULT CALLBACK WndProc (HWND hWnd, UINT MessageCode, WPARAM wParam, LPARAM lParam);

int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int CmdShow)
{
    const LPTSTR szWindowClass = _TEXT("Label Editing in TreeView");
    const LPTSTR szCaption = _TEXT("Label Edititing in TreeView");
    
    INITCOMMONCONTROLSEX InitComCtl;
    InitComCtl.dwSize = sizeof InitComCtl;
    InitComCtl.dwICC = ICC_TREEVIEW_CLASSES;
    InitCommonControlsEx (&InitComCtl);

    WNDCLASS WndClass;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
    WndClass.hCursor = LoadCursor (0, IDC_ARROW);
    WndClass.hIcon = LoadIcon (0, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = reinterpret_cast<WNDPROC>(WndProc);
    WndClass.lpszClassName = szWindowClass;
    WndClass.lpszMenuName = 0;
    WndClass.style = 0;

    RegisterClass (&WndClass);

    HWND hWnd = CreateWindow (
        szWindowClass, szCaption, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
        0, 0, 0, 0);

    ShowWindow (hWnd, CmdShow);
    UpdateWindow (hWnd);

    MSG MessageStruct;
    while (int a = GetMessage (&MessageStruct, 0, 0, 0))
    {
        if (a == -1) return -1;
        DispatchMessage (&MessageStruct);
    }

    return static_cast<int>(MessageStruct.wParam);
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT MessageCode, WPARAM wParam, LPARAM lParam)
{
    static HWND hTreeView;
    
    switch (MessageCode)
    {
    case WM_CREATE:
        {
            RECT ClientRect;
            GetClientRect (hWnd, &ClientRect);
            
            hTreeView = CreateWindow (
                WC_TREEVIEW, 0,
                WS_CHILD | WS_VISIBLE |  TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS,
                0, 0, ClientRect.right, ClientRect.bottom,
                hWnd, 0, 0, 0);

            TVINSERTSTRUCT InsertStruct;
            InsertStruct.hInsertAfter = TVI_ROOT;
            InsertStruct.hParent = TVI_ROOT;
            InsertStruct.item.mask = TVIF_TEXT;
            InsertStruct.item.pszText = _TEXT("ROOT");
            TreeView_InsertItem (hTreeView, &InsertStruct);

            return 0;
        }
    case WM_NOTIFY:
        {
            LPNMHDR pHeader = reinterpret_cast<LPNMHDR>(lParam);
            if (pHeader->hwndFrom == hTreeView && pHeader->code == TVN_ENDLABELEDIT)
            {
                return TRUE;
            }
            break;
        }
    case WM_DESTROY:

        PostQuitMessage (0);
        return 0;
    }
    return DefWindowProc (hWnd, MessageCode, wParam, lParam);
}


Может, какой нибудь стиль нужно добавить или сообщение обработать?

Добавлено @ 17:23 
А в диалоговом окне все пашет отлично!

Код

#include <windows.h>
#include <tchar.h>
#include <commctrl.h>
#include "resource.h"

#pragma comment (lib, "ComCtl32.Lib")

int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int CmdShow);
LRESULT CALLBACK WndProc (HWND hWnd, UINT MessageCode, WPARAM wParam, LPARAM lParam);

int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int CmdShow)
{
    INITCOMMONCONTROLSEX InitComCtl;
    InitComCtl.dwSize = sizeof InitComCtl;
    InitComCtl.dwICC = ICC_TREEVIEW_CLASSES;
    InitCommonControlsEx (&InitComCtl);

    return static_cast<int>(DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), 0, reinterpret_cast<DLGPROC>(WndProc)));
}

LRESULT CALLBACK WndProc (HWND hWnd, UINT MessageCode, WPARAM wParam, LPARAM lParam)
{
    static HWND hTreeView;
    
    switch (MessageCode)
    {
    case WM_INITDIALOG:
        {
            RECT ClientRect;
            GetClientRect (hWnd, &ClientRect);
            
            hTreeView = CreateWindow (
                WC_TREEVIEW, 0,
                WS_CHILD | WS_VISIBLE |  TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_EDITLABELS,
                0, 0, ClientRect.right, ClientRect.bottom,
                hWnd, 0, 0, 0);

            TVINSERTSTRUCT InsertStruct;
            InsertStruct.hInsertAfter = TVI_ROOT;
            InsertStruct.hParent = TVI_ROOT;
            InsertStruct.item.mask = TVIF_TEXT;
            InsertStruct.item.pszText = _TEXT("ROOT");
            TreeView_InsertItem (hTreeView, &InsertStruct);

            return TRUE;
        }
    case WM_NOTIFY:
        {
            LPNMHDR pHeader = reinterpret_cast<LPNMHDR>(lParam);
            if (pHeader->hwndFrom == hTreeView && pHeader->code == TVN_ENDLABELEDIT)
            {
                return TRUE;
            }
            return FALSE;
        }
    case WM_CLOSE:

        DestroyWindow (hWnd);
        return TRUE;

    case WM_DESTROY:

        EndDialog (hWnd, 0);
        return TRUE;
    }
    return FALSE;
}
 
PM MAIL   Вверх
Earnest
Дата 19.6.2006, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



По моему, ты в главном цикле забыл TranslateMessage

Добавлено @ 06:57 
Цитата

The TranslateMessage function translates virtual-key messages into character messages.

Т.е. твое окно не получает сообщений WM_CHAR, которые являются производными от WM_KEUDOWN. 


--------------------
...
PM   Вверх
0x07L
Дата 19.6.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 10.6.2006
Где: Москва

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



Да, с TranslateMessage все работает. На самом деле я его не забыл написать, а намеренно не написал. Никогда не думал, что WM_CHAR кроме меня может понадобиться кому-нибудь другому. Теперь буду писать его всегда. 
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.

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


 




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


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

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