win api-如何为树视图实现单独的事件过程

问题描述 投票:0回答:1

我已经创建了一个主窗口(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);

我想在单独的函数中处理树状视图的特定事件。我使用以下代码:

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

我应如何实施TRVProc?这是一个示例代码,TVN_BEGINLABELEDIT和TVN_ENDLABELEDIT事件在TRVProc中不可见:

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);
}

消息循环看起来是这样的:

while (GetMessage(&msg, nullptr, 0, 0))
{
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
c winapi subclassing
1个回答
0
投票

根据文档,可以为树视图实施单独的事件过程:

使用SetWindowLongPtr索引调用GWLP_WNDPROC会创建一个用于创建窗口的窗口类的subclass。一个应用程序必须将新窗口过程未处理的任何消息传递给通过调用CallWindowProc来执行上一个窗口过程。这允许应用程序创建窗口程序链

您要替换父窗口hwndParent)的默认窗口过程,而不是树形视图窗口(hwndTRV)。因此相关的代码行将如下所示:

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

另外,要接收TVN_BEGINLABELEDITTVN_BEGINLABELEDIT通知代码,您可能首先具有添加一些项目到树形视图中。然后,当您编辑项目的标签时,TVN_ENDLABELEDIT将收到上述通知代码。有关如何添加某些项目的示例,请参阅TVN_ENDLABELEDIT官方文档。

© www.soinside.com 2019 - 2024. All rights reserved.