mfc CTreeCtrl如何禁用
- 提问者网友:末路
- 2021-02-23 08:10
- 五星知识达人网友:归鹤鸣
- 2021-02-23 09:25
void CLeftView::OnItemExpanding(NMHDR* pNMHDR, LRESULT* pResult)
CTreeCtrl所表示的树控件是一个窗口,该窗口显示了分层的项列表。每一项都由标签和可选的为图化图像所组成,并且可以有与之关联的子项列表。
当需要纯子窗口控件时,使用CTreeCtrl.若希望树控件不仅作为控件还作为视图存在,则使用CTreeView,CTreeView类拥有框架窗口或拆分窗口的整个工作区,其大小随父窗口大小调整而自动调整,并可处理来自菜单,快捷键和工具栏的命令消息。
CTreeCtrl的典型使用模式:
1.创建控件。
若在对话框模板中指定了控件,或者正在使用CTreeView类,当创建对话框或者视图时,也自动创建控件。若要将控件创建为其他窗口的子窗口,则使用Create().
2.若控件要使用图像,调用SetImageList()函数设置图像列表。还可以调用SetIndent()来调整缩进。调整缩进最好在OnInitDialog()(对于对话框)或OnInitialUpadate()(对于视图)中进行。
3.通过为每个数据项调用一次CteeCtrl类的InsertItem()函数,向控件中填充数据。InsertItem()函数返回的是数据项的句柄,以后可以用该句柄引用数据项(如添加子项时)给数据项赋值最好也在OnInitalXXX时。
4.用户和控件交互过程中,控件将发送各种通知消息。通过在控件窗口的消息映射中添加ON_NOTIFY_REFLECT宏,或在父窗口的消息映射中添加ON_NOTIFY宏,可以指定一个函数来处理想要处理的每一条消息。
5.调用各种Set成员函数设置控件值。
6.调用各种Get成员函数检查控件内容。利用这些函数可以对树控件的内容遍历。
7.使用完后,销毁控件。
树控件的通信
1.若在使用CTreeView对象,使用函数CTreeView::GetTreeCtrl()获取对树控件的引用,可以利用如有工艺该值初始化另外一个引用,或将引用地址分配给CTreeCtrl指针。
2.如果树控件在对话框中,使用在对话框中创建的CTreeCtrl对象类型的成员变量。
3.如果树控件是一个子窗口,使用过去常用来狗仔对象的CTreeCtrl对象(或指针)
树控件的样式
创建树控件后,可以修改或者检索样式,方法是利用GetWindowLong()和SetWindowLong()函数为nIndex参数指定GWL_STYLE.
TVS_HASLINES样式通过在子项与其相应夫项间连线。
TVS_HASBUTTON在每一父项左侧有一BUTTON。
TVS_EDITABLE
TVS_NOTOOLTIPS
TVS_LINESATROOT
通过InsertItem()函数可以添加项,该函数返回HTREEITEM类型句柄。添加项时,必须指定新项的父项句柄。若在TVINSERTSTRUCT结构或hParent参数中,指定的是NULL活TVI_ROOT值,而不是父项句柄,则添加为根项。
- 1楼网友:夜余生
- 2021-02-23 10:37
估计是你在处理单击事件的时候,因为只有单击文本区域才会相应,所以你想增长这个文本区域。。是吧。
我也没找到方法,但是你可以重载树控件的鼠标响应事件,就可以实现了。
ctreectrlbt重载ctreectrl类。在类中加入如下
void ctreectrlbt::onmousemove(uint nflags, cpoint point) { // todo: add your message handler code here and/or call default if( m_bcursorontree == false ) //m_bcursorontree是全局的bool变量,判断鼠标是否在上面 { trackmouseevent tme; zeromemory(&tme,sizeof(trackmouseevent)); tme.cbsize = sizeof(tme); tme.hwndtrack = m_hwnd; tme.dwflags = tme_leave|tme_hover; tme.dwhovertime = 1; m_bcursorontree = _trackmouseevent(&tme); } ctreectrl::onmousemove(nflags, point); }
lresult ctreectrlbt::onmouseleave(wparam wparam, lparam lparam) { m_bcursorontree = false; return 0l; }
lresult ctreectrlbt::defwindowproc(uint message, wparam wparam, lparam lparam) { switch(message) { case wm_lbuttondblclk: //左键单击 {
//...............
break; } case wm_rbuttondown: //右键单击 {
//....
break;
} return ctreectrl::defwindowproc(message, wparam, lparam); }