Win API - как реализовать отдельную процедуру событий для дерева - PullRequest
0 голосов
/ 07 января 2020

Я создал главное окно (CreateWindowEx) с процедурой событий, установленной с помощью WNDCLASSEXW:

wcex.lpfnWndProc = WndProc;.

Далее я создал дочернее окно, которое используется как древовидное представление:

    HWND hwndTRV = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        WC_TREEVIEW,
        TEXT("Tree View"),
        WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_EDITLABELS,
        0,
        0,
        rcClient.right,
        rcClient.bottom,
        hwndParent,
        NULL,
        hInstance,
        NULL);

Я хотел бы обработать древовидное представление, определяющее c события в отдельной функции. Я использую следующий код:

SetWindowLongPtr(hwndTRV, GWLP_WNDPROC, (LONG_PTR)TRVProc);

Как мне реализовать TRVPro c? Вот пример кода: события TVN_BEGINLABELEDIT и TVN_ENDLABELEDIT не отображаются в TRVPro c:

LRESULT CALLBACK TRVProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_NOTIFY:
        {
            LPNMHDR l = (LPNMHDR)lParam;

            switch (l->code)
            {
                case TVN_BEGINLABELEDIT:
                {
                    return 0;
                }

                case TVN_ENDLABELEDIT:
                {
                    return 1;
                }
            }
        }
    }

    return CallWindowProc(WndProc, hWnd, message, wParam, lParam);
}

Сообщение l oop выглядит следующим образом:

while (GetMessage(&msg, nullptr, 0, 0))
{
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

1 Ответ

0 голосов
/ 10 января 2020

Реализация отдельной процедуры событий для древовидного представления возможна на основе документа:

Вызов SetWindowLongPtr с индексом GWLP_WNDPROC создает подкласс класса окна используется для создания окна. Приложение должно передать любые сообщения, не обработанные новой оконной процедурой, предыдущей оконной процедуре, вызвав CallWindowProc. Это позволяет приложению создавать цепочку оконных процедур .

. Вместо этого вы хотите заменить оконную процедуру по умолчанию родительское окно (hwndParent). окна просмотра дерева (hwndTRV). Таким образом, соответствующая строка кода будет выглядеть так:

SetWindowLongPtr(hwndParent, GWLP_WNDPROC, (LONG_PTR)TRVProc);

Кроме того, для получения TVN_BEGINLABELEDIT и TVN_ENDLABELEDIT кода уведомления вы можете добавить некоторые элементы сначала в виде дерева. Затем, когда вы редактируете ярлык элемента, TRVProc получит указанный выше код уведомления. Для примера того, как добавить некоторые элементы, вы можете обратиться к этому официальному документу.

...