本文共 4172 字,大约阅读时间需要 13 分钟。
在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/