控件–TreeView(SysTreeView32)-WindowsAPI论坛-WindowsAPI-津桥芝士平台

控件–TreeView(SysTreeView32)

使用WindowsAPI,创建SysTreeView32控件:

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

#pragma comment(lib, "comctl32.lib")

#define ID_TREEVIEW 101
HWND hwndTreeView;

HTREEITEM InsertTreeViewItem(HWND hwndTV, LPCWSTR text, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST) 
{
    TVINSERTSTRUCT tvis = {};
    tvis.hParent = hParent;
    tvis.hInsertAfter = hInsertAfter;
    tvis.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
    tvis.item.pszText = (LPWSTR)text;
    // 添加节点到树视图
    return (HTREEITEM)SendMessage(hwndTV, TVM_INSERTITEM, 0, reinterpret_cast<LPARAM>(&tvis));
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{
    switch (uMsg) 
    {
    case WM_CREATE: 
    {
        // 创建树视图控件
        hwndTreeView = CreateWindowEx(0, WC_TREEVIEW, NULL,
            WS_VISIBLE | WS_CHILD | WS_BORDER | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS,
            10, 10, 300, 400, hwnd, (HMENU)ID_TREEVIEW, NULL, NULL);

        // 插入树节点,添加根节点
        HTREEITEM hRoot = InsertTreeViewItem(hwndTreeView, L"Root Node");
        HTREEITEM hChild1 = InsertTreeViewItem(hwndTreeView, L"Child Node 1", hRoot);
        HTREEITEM hChild2 = InsertTreeViewItem(hwndTreeView, L"Child Node 2", hRoot);
        break;
    }
    
    case WM_NOTIFY: 
    {
        LPNMHDR lpnmh = (LPNMHDR)lParam;
        if (lpnmh->hwndFrom == hwndTreeView && lpnmh->code == TVN_SELCHANGED) 
        {
            LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
            wchar_t buf[256];
            TVITEM tvi;

            tvi.mask = TVIF_TEXT;
            tvi.hItem = pnmtv->itemNew.hItem;
            tvi.pszText = buf;
            tvi.cchTextMax = 256;

            if (TreeView_GetItem(hwndTreeView, &tvi)) 
            {
                //MessageBox(hwnd, tvi.pszText, L"Selected Node", MB_OK);
            }
        }
        return 0;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{
    // 初始化Common Controls
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(icex);
    icex.dwICC = ICC_TREEVIEW_CLASSES;
    InitCommonControlsEx(&icex);

    // 创建窗口类
    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = L"TreeViewExample";
    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(0, L"TreeViewExample", L"TreeView Example",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 450,
        NULL, NULL, hInstance, NULL);

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

效果图:

image

请登录后发表评论

    没有回复内容