#include<windows.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<CommCtrl.h>
#define TREE_VIEW 122
HINSTANCE ghInstance;
HTREEITEM item1;
HTREEITEM item2;
HTREEITEM item3;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HTREEITEM AddItemToTree( //添加节点
HWND hwndTV,
LPWSTR lpszItem,//LpszItem,节点的名字
HTREEITEM hParent); //父节点的句柄
BOOL InitTreeViewItems(HWND hwndTV); // 创建多个节点
HWND CreateATreeView(HWND hwndParent);
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR str, INT iCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASS wndClass;
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = WndProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName = NULL;
wndClass.lpszClassName = TEXT("calc");
RegisterClass(&wndClass);
ghInstance = hInstance;//未来用于创建控件----control
hWnd = CreateWindow(TEXT("calc"), //创建窗口
TEXT("C_DeskTop.Exe"),// 窗口标题
WS_OVERLAPPEDWINDOW, //正在创建的窗口的样式
CW_USEDEFAULT, //窗口的初始水平位置
CW_USEDEFAULT, //窗口的初始垂直位置
CW_USEDEFAULT, //窗口的宽度
CW_USEDEFAULT, //窗口的高度
NULL, //正在创建的主窗口的句柄
NULL, //菜单的句柄
hInstance, //当前实例句柄
NULL //一般为NULL
);
ShowWindow(hWnd, iCmdShow);//显示
UpdateWindow(hWnd);//初始化刷新
while (GetMessage(&msg, NULL, 0, 0)) { //消息机制
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,// 消息处理
LPARAM lParam) {
static HWND tv_parent = NULL;
static HWND tt_obj = NULL;
static HTREEITEM tv_item = NULL;
wchar_t text[50] = L"";
switch (message) {
case WM_CREATE: //===》创建
tv_parent = CreateATreeView(hWnd);
TreeView_GetNextItem(hWnd, NULL, TVGN_ROOT);//检索消息 发给了主窗口--不该这样用
return 0;//返回值为零以继续创建窗口
case TVM_GETNEXTITEM: //===》TreeVIew Item 创建
switch (wParam)
{
case TVGN_ROOT:
if (InitTreeViewItems(tv_parent) && tv_parent != NULL)
break;
}
return 0;
case WM_NOTIFY: //NM 通知消息
switch (((LPNMHDR)lParam)->code) //TVN_SELCHANGED notification code from:(LPARAM) & nmhr 指针 this: lParam 指针
{
case TVN_SELCHANGED:
tv_item=TreeView_GetNextItem(tv_parent, NULL, TVGN_CARET);//获取当前选择Item
wchar_t buf[1024] = { 0 };
TVITEM Item;
Item.pszText = buf; //文本存放
Item.mask = TVIF_TEXT;
Item.cchTextMax = 1024;
Item.hItem = tv_item;//HTREEITEM的句柄放进去
TreeView_GetItem(tv_parent, (LPARAM)&Item);//得到TVITEM
MessageBox(hWnd, Item.pszText, L"", MB_ICONWARNING);
break;
}//没有return 0 因为这个消息太多 我没法处理完
return DefWindowProc(hWnd, message, wParam, lParam);
case WM_DESTROY: //===》结束
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
HWND CreateATreeView(HWND hwndParent)
{
HWND hwndTV;
hwndTV = CreateWindowEx(0,
WC_TREEVIEW,
TEXT("Tree View1"),
WS_VISIBLE | WS_CHILD | WS_BORDER| TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT,//
10,
190,
140,
300,
hwndParent,
(HMENU)TREE_VIEW,
ghInstance,
NULL);
return hwndTV;
}
HTREEITEM AddItemToTree( //添加节点
HWND hwndTV,
LPWSTR lpszItem,//LpszItem,节点的名字
HTREEITEM hParent) //父节点的句柄
{
TVITEM tvi;//指定或接收树景项的属性
TVINSERTSTRUCT tvins;//包含用于将新项目添加到树景控制中的信息。此结构用于TVM_INSERTITEM消息
HTREEITEM hme;
//设置ITEM的参数
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_DI_SETITEM | TVIF_PARAM;
tvi.pszText = lpszItem;
//填充STRUCT结构
tvins.item = tvi;
tvins.hInsertAfter = TVI_ROOT;
if (hParent == NULL)
{
tvins.hParent = TVI_ROOT;
}
else
{
tvins.hParent = hParent;
}
//调用关键的TreeView_InsertItem函数
hme = TreeView_InsertItem(hwndTV, &tvins);
return hme;
}
BOOL InitTreeViewItems(HWND hwndTV) // 创建多个节点
{
item1 = AddItemToTree(hwndTV, L"No_1", NULL);//根节点
item2 = AddItemToTree(hwndTV, L"Th_2", item1);//根节点下的子节点
item3 = AddItemToTree(hwndTV, L"Th_3", item1);//根节点下的子节点
return TRUE;
}
很多部分都是截取”知名大牛“的代码 他们是有版权的 但是在这我没显示 因为我没有记录他们的文章链接 希望大牛不要太介意 (小白一枚)🤭 如果版权有需要请留言 我会加上的