win32强化练习4.8_TreeView快速应用(处理消息)

创建完TreeView控件后,通过SendMessage(),来增加、删除、安排各个项目;每个消息都有一个或多个相应的宏来代替直接发送消息。

TreeView样式:创建窗口时直接设置,或者通过SetWindowLongGetWindowLong来设置和获得样式 - 略

TreeView的通知消息(事件发生)(树型视图发送给父窗口的通知消息以TVN_打头(Notify)。 树型视图接收到的消息以TVM_打头(Message):

-- wParam ==控件的ID。因为该值不是唯一的,故我们不用它。我们使用NMHDR结构体

-- lParam == 指向NMHDR结构体指针

我们也不去说常用的控件消息了,因为有点多,直接上练习( 树型视图控件将发送 WM_NOTIFY 消息给它的父窗口,而并不是WM_COMMAND ):

1. 单击 NM_CLICK

2. 双击 NM_DBLCLK

接上一节已经建立好的TreeView程序,先处理一下单击的弹窗测试:

case WM_NOTIFY:
		{
			NMHDR* phdr = (NMHDR *)lParam;
			switch(phdr->code)
			{
				case NM_CLICK:          //单击事件
					MessageBox(0,"click","",0);
				break;
			}
		}
		break;
然后解决一下ID的问题,这是因为如果我建立了不止一个树控件,那么不判断ID的话所有的树控件都会响应单击弹窗,这是我们不想要的!

case NM_CLICK:          //单击事件
					if (LOWORD(wParam) == 10037)
						MessageBox(0,"click 1","",0);
					if (LOWORD(wParam) == 10038)
						MessageBox(0,"click 2","",0);
				break;


事件响应搞定后,我们直接来获取点击项的文本,这个就没有列表框控件那么简单的先GetCurSelect,然后GetText就可以的,有点小复杂:

先要知道点在了哪个Item的上面,这里的每一项都是HTREEITEM的句柄控制的,因此先要拿到它的句柄

1.1 我们曲线救国,先HitTest取HTREEITEM hItem的句柄

TVHITTESTINFO ht;
POINT pp;
GetCursorPos(&pp);
ScreenToClient(hWndTree, &pp);   //必须转换成TreeView窗口的坐标,注意不是hwnd的窗口
ht.flags = TVHT_ONITEMLABEL;
ht.pt = pp;			
HTREEITEM hItem1 = TreeView_HitTest(hWndTree,&ht);
1.2 然后利用结构体TVITEM Item;从结构体中取出文本
		CHAR buf[1024]= {0};
					TVITEM Item;
					Item.pszText = buf;		//文本存放 
					Item.mask = TVIF_TEXT;
					Item.cchTextMax = 1024;
					Item.hItem = hItem1;//HTREEITEM的句柄放进去
				
					
					TreeView_GetItem(hTreeView, (LPARAM)&Item);//得到TVITEM
					MessageBox(0,Item.pszText,"",0);


以上,TREEVIEW的基本应用就OK了。 或许,你在使用TREEVIEW的时候还需要遍历\更改项,这些就自己去研究吧。

 









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值