控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

关于TreeView控件

作者:未知 出处:不详 2010年02月24日 阅读:

(1)SetCheck

对于对话框中的TreeView控件,如果想在初始化(OnInitDialog)中SetCheck,必须:

m_tree.ModifyStyle( TVS_CHECKBOXES, 0 );

m_tree.ModifyStyle( 0, TVS_CHECKBOXES );

m_tree.SetCheck(hItem, TRUE);

即即使在对话框编辑器中为TreeView增加了Check Boxes属性,也必须重新设一次TVS_CHECKBOXES,SetCheck才能起作用

而对于非初始化中的SetCheck,则不受影响

(2)OnCheckChange

 对于TreeView中的checkbox,没有对应的notify,必须自己处理

 参考msdn.microsoft.com,Q261289

 我的做法稍有不同:

 第一步:继承CTreeCtrl

 class CMyTreeCtrl : public CTreeCtrl

二:增加WM_LBUTTONDOWN处理函数。包括:

代码

.h:

// 定义自定义消息,用于通知父窗口

#define UM_CHECKSTATECHANGE (WM_USER + xxx)

afx_msg void OnLButtonDown(UINT nFlags, CPoint point) ;

  

.cpp:

ON_WM_LBUTTONDOWN()

void CMyTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)

{

TVHITTESTINFO tvHitInfo = { point.x, point.y } ;

HitTest(&tvHitInfo) ;

// 测试击键位置

if (tvHitInfo.flags & TVHT_ONITEMSTATEICON)

GetParent()->SendMessage(UM_CHECKSTATECHANGE,

WPARAM(GetDlgCtrlID()), LPARAM(tvHitInfo.hItem)) ;

// 通知父窗口

CTreeCtrl::OnLButtonDown(nFlags, point) ;

}

发现不能捕获WM_LBUTTONUP?!原因不知,请各位指教

发送消息不能用PostMessage。原因请看第三步

由于只能捕获WM_LBUTTONDOWN,将导致一个问题,即如果用户在checkbox中按下,却拖动鼠标在checkbox外放手,就会出现不一致情况,因为checkbox是收到WM_LBUTTONUP才作出反应的

目前我还没有很好的解决这个问题,只有一个弱智办法,通过timer来“纠正”错误。同样请各位指教。

三:在dialog中,处理UM_CHECKSTATECHANGE

代码

.h:

afx_msg void OnCheckChange(UINT nID, HTREEITEM hItem) ;

 

.cpp:

ON_MESSAGE(UM_CHECKSTATECHANGE, OnCheckChange)

void CxxxDlg::OnCheckChange(UINT nID, HTREEITEM hItem)

{

switch (nID)

{

case IDC_TREEVIEW: // IDC_TREEVIEW:TreeView控件的ID

if (m_tree.GetCheck(hItem))

{ // original checked, now unchecked

// TODO: 增加Unchecked代码

}

else

{ // original unchecked, now checked

// TODO: 增加Checked代码

}

break ;

}

}

这里要注意,(GetCheck(hItem) == TRUE)表示Unchecked,(GetCheck(hItem) == FALSE)表示Checked,原因在于在CMyTreeCtrl中捕获的是WM_LBUTTONDOWN,OnCheckChange发生时,checkbox还未变化。基于同样原因,第二步中不能使用PostMessage,而必须SendMessage,以免出错

不能在最后增加m_tree.SetCheck()来解决第二步中提到的问题。

根本办法在于设法捕获WM_LBUTTONUP

与microsoft的做法相比:减少了获取鼠标点击位置和坐标映射的代码;CMyTreeCtrl可以独立出来重用

(3)TreeView的子窗口

   在特殊的情况下,需要在TreeView中添加子窗口

   主要问题:当TreeView中内容发生变化时,将重绘客户区,将子窗口也抹去(?!至于原因,又要请各位指教了),即使子窗口设为TOPMOST

   我的方法:

   第一步:

   继承CTreeCtrl:class CMyTreeCtrl : public CTreeCtrl

   处理WM_PAINT,同时通知父窗口:

代码

.h:

#define UM_TREEREDRAW (WM_USER + xxx)

afx_msg void OnPaint();

.cpp:

ON_WM_PAINT()

void CMyTreeCtrl::OnPaint()

{

CTreeCtrl::OnPaint() ;

GetParent()->SendMessage(UM_TREEREDRAW,

WPARAM(GetDlgCtrlID()), LPARAM(0)) ;

}

二:处理UM_TREEREDRAW:

代码

void CxxxDlg::OnTreeRedraw(UINT nID, LPARAM lParam)

{

switch (nID)

{

case IDC_TREEVIEW: // IDC_TREEVIEW:TreeView控件的ID

wndChild.RedrawWindow(NULL, NULL, RDW_INVALIDATE) ; // 强制重绘子窗口

break ;

}

}

                                                           
                                                            【注:本文由控件中国网转载】

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统