博客
关于我
Win32 树视图控件的基本使用
阅读量:113 次
发布时间:2019-02-26

本文共 4172 字,大约阅读时间需要 13 分钟。

使用C++创建树视图控件

一、创建树视图控件

在C++中使用Windows公共控件库创建树视图控件的基本步骤如下:

  • 导入必要的头文件

    • 包括<windows.h><commctrl.h>,确保有树视图控件的支持。
  • 注册窗口类

    • 使用RegisterClassEx函数注册窗口类,指定窗口的类名和窗口处理函数。
  • 创建主窗口

    • 使用CreateWindowEx函数创建主窗口,设置窗口的位置和样式。
  • 创建树视图控件

    • 使用CreateWindow函数创建树视图控件,指定窗口的类名和样式参数。常用的样式参数包括:

      • WS_CHILD:表示该窗口是另一个窗口的子窗口。
      • WS_BORDER:设置边框。
      • WS_VISIBLE:设置可见。
      • TVM_HASLINES:显示线条。
      • TVM_HASBUTTONS:显示按钮。
      • TVM_LINESATROOT:根结点下方显示线条。
    • 将树视图控件插入主窗口,获取其句柄。

  • 验证控件创建

    • 使用wsprintf函数格式化树视图句柄地址,并通过MessageBox显示确认。

  • 二、添加根结点

  • 定义插入结构体

    • 创建TVINSERTSTRUCT结构体TvInsertItem,用于描述要插入的树节点。
  • 设置结构体属性

    • hParent:父结点句柄,根结点填NULL
    • hInsertAfter:插入位置,使用TVI_LAST表示插入列表末尾。
    • item:存储节点信息,包括:
      • mask:设置节点类型,使用TVIF_TEXT表示文本节点。
      • pszText:节点显示文本。
  • 发送插入消息

    • 使用SendMessage函数发送TVM_INSERTITEM消息,传递结构体指针,获取新增节点句柄。
  • 验证插入结果

    • 检查是否成功获取节点句柄,确认树节点已正确添加。

  • 三、扩展树结构

  • 添加子节点

    • 重复上述步骤,使用已存在节点的句柄作为新的父节点。
    • 将新的节点插入到父节点的末尾或指定位置。
  • 创建多层级结构

    • 逐步添加子节点,确保树结构层次清晰。

  • 四、完整代码示例

    #include 
    #include
    #define IDM_EXIT 10001
    #define IDM_ABOUT 10002
    #define IDC_WIN32TREEDEMO 10101
    LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static HINSTANCE hInst = NULL;
    static HWND hTree = NULL;
    switch (message)
    {
    case WM_CREATE:
    hTree = CreateWindow("SysTreeView32", NULL,
    WS_CHILD | WS_BORDER | WS_VISIBLE | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT,
    10, 20, 200, 400, hwnd, NULL, NULL, NULL);
    TvInsertItem.hParent = NULL;
    TvInsertItem.hInsertAfter = TVI_LAST;
    TvInsertItem.item.mask = TVIF_TEXT;
    TvInsertItem.item.pszText = "根结点AAAA";
    hitema = SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&TvInsertItem);
    TvInsertItem2.hParent = hitema;
    TvInsertItem2.hInsertAfter = TVI_LAST;
    TvInsertItem2.item.mask = TVIF_TEXT;
    TvInsertItem2.item.pszText = "子结点AABB";
    hitemab = SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&TvInsertItem2);
    TvInsertItem3.hParent = hitema;
    TvInsertItem3.hInsertAfter = TVI_LAST;
    TvInsertItem3.item.mask = TVIF_TEXT;
    TvInsertItem3.item.pszText = "子结点AACC";
    hitemac = SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&TvInsertItem3);
    TvInsertItem4.hParent = NULL;
    TvInsertItem4.hInsertAfter = TVI_LAST;
    TvInsertItem4.item.mask = TVIF_TEXT;
    TvInsertItem4.item.pszText = "根结点BBBB";
    hitemb = SendMessage(hTree, TVM_INSERTITEM, 0, (LPARAM)&TvInsertItem4);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
    }
    int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
    {
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = "win32TreeDemo";
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof(WNDCLASSEX);
    wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wincl.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32TREEDEMO);
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    if (!RegisterClassEx(&wincl))
    return 0;
    hwnd = CreateWindowEx(
    0,
    "win32TreeDemo",
    TEXT("win32TreeDemo"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    300,
    500,
    HWND_DESKTOP,
    NULL,
    hThisInstance,
    NULL
    );
    ShowWindow(hwnd, nFunsterStil);
    while (GetMessage(&messages, NULL, 0, 0))
    {
    TranslateMessage(&messages);
    DispatchMessage(&messages);
    }
    return messages.wParam;
    }

    五、资源文件

    #resource.h
    IDC_WIN32TREEDEMO MENU BEGIN
    POPUP "File"
    BEGIN
    MENUITEM "E&xit", IDM_EXIT
    END
    POPUP "Help"
    BEGIN
    MENUITEM "&About ...", IDM_ABOUT
    END
    END

    六、常用宏定义

    #define IDM_EXIT        10001
    #define IDM_ABOUT 10002
    #define IDC_WIN32TREEDEMO 10101

    转载地址:http://mquy.baihongyu.com/

    你可能感兴趣的文章
    NOIP2011T1 数字反转
    查看>>
    NOIP2014 提高组 Day2——寻找道路
    查看>>
    noip借教室 题解
    查看>>
    NOIP模拟测试19
    查看>>
    NOIp模拟赛二十九
    查看>>
    Vue3+element plus+sortablejs实现table列表拖拽
    查看>>
    Nokia5233手机和我装的几个symbian V5手机软件
    查看>>
    non linear processor
    查看>>
    Non-final field ‘code‘ in enum StateEnum‘
    查看>>
    none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
    查看>>
    None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
    查看>>
    NoNodeAvailableException None of the configured nodes are available异常
    查看>>
    Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
    查看>>
    nopcommerce商城系统--文档整理
    查看>>
    NOPI读取Excel
    查看>>
    NoSQL&MongoDB
    查看>>
    NoSQL介绍
    查看>>
    NoSQL数据库概述
    查看>>
    Notadd —— 基于 nest.js 的微服务开发框架
    查看>>
    NOTE:rfc5766-turn-server
    查看>>