win32强化练习4.8_TreeView快速应用(处理消息)
2016-11-27 16:41
309 查看
创建完TreeView控件后,通过SendMessage(),来增加、删除、安排各个项目;每个消息都有一个或多个相应的宏来代替直接发送消息。
TreeView的样式:创建窗口时直接设置,或者通过SetWindowLong或GetWindowLong来设置和获得样式
- 略
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;从结构体中取出文本
以上,TREEVIEW的基本应用就OK了。或许,你在使用TREEVIEW的时候还需要遍历\更改项,这些就自己去研究吧。
TreeView的样式:创建窗口时直接设置,或者通过SetWindowLong或GetWindowLong来设置和获得样式
- 略
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的时候还需要遍历\更改项,这些就自己去研究吧。
相关文章推荐
- win32强化练习4.7_快速建立TreeView
- win32强化练习4.9_快速建立ListView
- win32强化练习1.1_MessageBox简单应用及手动编译
- win32强化练习3.2_鼠标消息
- Win32消息处理API---BroadcastSystemMessage、BroadcastSystemMessageEx
- Win32消息处理API---PeekMessage
- Win32消息处理API---WaitMessage
- Win32消息处理API---SendMessage
- C++ Builder中消息处理过程及应用
- C#应用消息队列异步处理数据存储
- win32应用开发(完全用windows API)开发窗体和处理窗体事件
- Win32编程中如何处理控制台消息
- 原谅我今天才学会使用win32的按键消息处理!
- Android消息处理-应用参考篇
- Win32消息处理API---PostMessage
- Win32消息处理API---PeekMessage
- Win32消息处理API---PeekMessage
- 应用消息队列异步处理数据存储
- WIN32汇编: 7.处理鼠标输入消息
- 一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数