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

本文共 4078 字,大约阅读时间需要 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 10101LRESULT 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.hIDC_WIN32TREEDEMO MENU BEGINPOPUP "File"BEGINMENUITEM "E&xit",        IDM_EXITENDPOPUP "Help"BEGINMENUITEM "&About ...",    IDM_ABOUTENDEND

    六、常用宏定义

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

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

    你可能感兴趣的文章
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
    查看>>