返回首页


{S0}简介
不少请求后,我想我会后这棵树的控制,采用了类似的选择绘画风格我张贴在这里的列表控制:。对于一个额外的好处,我也包括支持多重选择。如何使用CTreeCtrl的
只需使用树控制,你会正常CTreeViewCtrl,但是有几个需要激活和检索多重选择的功能:无效ShowThemed( 布尔bShowThemed = TRUE,)说明
绘制项目选择主题。参数bShowThemed - TRUE =绘制主题的选择; FALSE,=经典模式。无效SetMultipleSelect( 布尔bMultipleSelect)说明
开启/关闭多个选择。参数bMultipleSelect - TRUE =打开多个选择。无效GetSelectedItems( CSimpleArray LT; HTREEITEM GT;放大器; aSelectedItems)说明
检索选定的树项目的清单。参数aSelectedItems - 参考HTREEITEM阵列。最后
有任何意见或建议,欢迎。历史三月十六日,2006年:1.0首次发行。3月20日,2006年:1.1VS2005的小bug修复。第五,2006年4月:1.2更正的多种选择和复选框问题 - 许多感谢菲尔C.

回答

评论会员:zhangjingfei 时间:2011/12/06
居然用VC 6打不开

我不知道白什么戊午@ @
评论会员:金旭 时间:2011/12/06
消息处理OnLButton不叫每次。这就是所谓的只用双击

最好的问候!

你好世界
评论会员:阿迪亚raut 时间:2011/12/06
我发现这个"致命错误RC1015:无法打开包含文件'atlres.h"。"编译时出现错误。这可能是因为缺少"atlres.h"从项目文件。

找不到它的任何地方,需要您的帮助。

感谢
Akshat
评论会员:toddma 时间:2011/12/06
有人应该张贴本VC6的版本
最后,我这个错误:
C:\ Documents和Settings \ tmarshall \我的文档\下载\树型\ treectrl.h(99):错误C2664:"添加":不能将参数1从'结构_TREEITEM *'到'结构_TREEITEM *'
&# 160; 参考,并不以"常量"不能绑定到非左值

数字呢?
感谢
评论会员:toddma 时间:2011/12/06
无效GetSelectedItems(CSimpleArray aSelectedItems)
{
aSelectedItems.RemoveAll()如果(!m_bMultipleSelect)
{
aSelectedItems.Add(GetSelectedItem())/ /
COLORREF SetBkColor(COLORREF BK)
{
m_rgbBackground = BK;
CWindowImpl的:SetBkColor(BK);
}

 60; 无效OnLButtonDown(UINT nFlags,口岸系统点)
{
& #160; (m_bMultipleSelect)
{
 60; / /重置选定的项目,如果一个单一的项目上点击
 60; UINT的标志= 0;
HTREEITEM hNewItem的HitTest(点,旗)
如果(标志TVHT_ONITEMBUTTON)
{
SetMsgHandled(FALSE)
返回
&# 160; }

m_bCtrlKey =((GetKeyState(VK_CONTROL)等于0x8000)= 0)
m_bShiftKey =((GetKeyState(VK_SHIFT)等于0x8000)= 0)
  ;
(m_bCtrlKey | | m_bShiftKey)
 0; 返回

(hNewItem!= NULL)
{
 0; UINT nNewSelectState =(GetItemState(hNewItem,TVIS_SELECTED)TVIS_SELECTED)
ResetSelected(GetRootItem())

SetItemState(hNewItem,nNewSelectState,TVIS_SELECTED); & #160; m_hFirstSelected = hNewItem;
}
&# 160; }

SetMsgHandled(FALSE)
}

无效OnLButtonUp(UINT nFlags,口岸系统点)
{
SetMsgHandled(FALSE)
& #160;
如果(!m_bMultipleSelect)
 0; 返回

UINT的标志= 0;
& #160;HTREEITEM hNewItem的HitTest(点,旗)
如果(标志TVHT_ONITEMBUTTON)
返回

 0; HTREEITEM hOldItem = GetSelectedItem()
 0;
(m_bCtrlKey)
{
&# 160; (hNewItem!= NULL)
{
UINT nNewSelectState = GetItemState(hNewItem,TVIS_SELECTED)TVIS_SELECTED? 0:TVIS_SELECTED;
 60; UINT nOldSelectState = hOldItem == NULL? 0:GetItemState(hOldItem,TVIS_SELECTED)

  ; / /选择新的项目(获得焦点)
SelectItem(hNewItem);

&# 160; / /设置新项目的突出状态
  ; (GetItemState(hNewItem,TVIS_SELECTED)!= nNewSelectState)

SetItemState(hNewItem,nNewSelectState,TVIS_SELECTED);

/ /恢复旧所选项目的状态 如果(hOldItem!= NULL hOldItem!= hNewItem GetItemState(hOldItem,TVIS_SELECTED)!= nOldSelectState)

SetItemState(hOldItem,nOldSelectState,TVIS_SELECTED);
m_hFirstSelected = NULL;
}
}
否则,如果(m_bShiftKey)
& #160; {
/ /初始化的参考项目,如果这是第一个移位选择
(m_hFirstSelected == NULL)
m_hFirstSelected = GetSelectedItem()

/ /选择新的项目(获得焦点)
(hOldItem == hNewItem)
SelectItem(NULL); / /以防止编辑

(m_hFirstSelected!= NULL)
SelectItems(m_hFirstSelected,hNewItem)
}

m_bCtrlKey = FALSE;
m_bShiftKey = FALSE;
}
&# 160;



克里斯戴维斯
评论会员:jxlixiaoqing 时间:2011/12/06
我看到你的CListCtrl的WTL的版本,我也希望有MFC版本。
评论会员:yongshuan施 时间:2011/12/06
我已经下载并构建它,树控制的项目的文字不能显示完全当我启动它,并选择"为主题的"。
我的操作系统是XP的中国,它显示正常,当我改变对中国的对话框模板的语言属性。

我为我的池英语
抱歉
评论会员:!_oti 时间:2011/12/06
启动程序,然后点击第一项。
选择消失。
得到选择上的第一个项目,然后按住Shift点击进一步下降。
本节包含一切从第二次的点击项目树的底部。
使用Ctrl点击选择第3项,然后按住Shift点击某处进一步下降。第一项是不选择。

使用箭头键来上下移动树。在顶部和底部,选择消失,如果按住键不放。同样的情况,如果你使用的左,右箭头键展开或折叠节点。

投入使用对话框编辑器的树复选框。按空格键将只翻转一个复选框的选择,选择消失。

我认为伟大的风俗画,我要使用它,但多重选择功能需要大量的工作。 "我做了一个位,解决了其中的一些,但它将会采取更加,我想。

这里的差异:
135,144c135,136

< 		HTREEITEM hItem = GetNextVisibleItem( GetRootItem() );

< 		

< 		SetRedraw( FALSE );

< 		

< 		// clear selection upto the first item

< 		for ( ; hItem != NULL && hItem != hItemFrom && hItem != hItemTo; hItem = GetNextVisibleItem( hItem ) )

< 			SetItemState( hItem, 0, TVIS_SELECTED );

< 

< 		// is item visible?

< 		if ( hItem != NULL )

---

> 		HTREEITEM hItem = GetRootItem();

> 		for ( ; hItem != NULL; hItem = GetNextVisibleItem( hItem ) )

146,148c138,142

< 			SelectItem( hItemTo );

< 

< 			if ( hItem == hItemTo )

---

> 			if ( hItem == hItemFrom )

> 			{

> 				break;

> 			}

> 			else if ( hItem == hItemTo )

152a146

> 				break;

153,155c148,149

< 

< 			// go through remaining visible items

< 			for ( BOOL bSelectItem = TRUE; hItem != NULL; hItem = GetNextVisibleItem( hItem ) )

---

> 		}

> 		if ( hItem == NULL )

157,161c151

< 				SetItemState( hItem, bSelectItem ? TVIS_SELECTED : 0, TVIS_SELECTED );

< 

< 				// do we need to start removing items from selection?

< 				if ( hItem == hItemTo ) 

< 					bSelectItem = FALSE;

---

> 			return FALSE;

163a153,162

> 		

> 		SetRedraw( FALSE );

> 		

> 		// clear whole selection

> 		ResetSelected( GetRootItem() );

> 

> 		// is item visible?

> 		for ( hItem = hItemFrom; hItem != hItemTo; hItem = GetNextVisibleItem( hItem ) )

> 		{

> 			SetItemState( hItem, TVIS_SELECTED, TVIS_SELECTED );

164a164

> 		SetItemState( hItemTo, TVIS_SELECTED, TVIS_SELECTED );

242c243,245

< 		if ( ( nChar == VK_UP || nChar == VK_DOWN ) && GetKeyState( VK_SHIFT ) & 0x8000 )

---

> 		if ( m_bMultipleSelect && ( nChar == VK_UP || nChar == VK_DOWN ) )

> 		{

> 			if ( GetKeyState( VK_SHIFT ) & 0x8000 )

265c268,290

< 		else if ( nChar >= VK_SPACE )

---

> 			else	// no shift key

> 			{

> 				HTREEITEM hSel = GetSelectedItem();

> 				m_hFirstSelected = NULL;

> 				ResetSelected( GetRootItem() );

> 				SelectItem( hSel );

> 			}

> 		}

> 		else if ( nChar == VK_SPACE && (GetStyle() & TVS_CHECKBOXES) == TVS_CHECKBOXES )

> 		{

> 			HTREEITEM hSel = GetSelectedItem();

> 			BOOL bChecked = GetCheckState(hSel);

> 			CSimpleArray<HTREEITEM> aSel;

> 			GetSelectedItems(aSel);

> 			for (int ctr = 0; ctr < aSel.GetSize(); ctr++)

> 			{

> 				if (aSel[ctr] != hSel)

> 				{

> 					SetCheckState(aSel[ctr], !bChecked);

> 				}

> 			}

> 		}

> 		else if ( isalnum(nChar) )

300c325,326

< 			if ( HitTest( point, NULL ) != NULL )

---

> 			HTREEITEM hNewItem = HitTest( point, NULL );

> 			if ( hNewItem != NULL )

302a328

> 				UINT nItemSelState = GetItemState(hNewItem, TVIS_SELECTED) & TVIS_SELECTED;

303c330,331

< 				m_hFirstSelected = NULL;

---

> 				SetItemState(hNewItem, nItemSelState, TVIS_SELECTED);

> 				m_hFirstSelected = hNewItem;

这仍然没有解决的选择,如果你点击并拖动另一个项目发生了什么,或者如果您设置或清除该复选框,如果选择另一个项目是。

菲尔。

所有的事情考虑,你不能真正考虑所有的事情... ...
评论会员:AlanW 时间:2011/12/06
菲尔,

我现在已经解决了这 - 新的代码应包括这些变化

非常感谢您的帮助。
评论会员:lihezhao 时间:2011/12/06
感谢您的工作,但我发现了错误,你错过了MSG_WM_CREATE(OnCreate中)在消息映射,所以如果在一个窗口创建一个树型一个对话框,在运行时在设计时,树型显示是不对的!
评论会员:AlanW 时间:2011/12/06
感谢,指出这一点 - 我会尽快更新的代码。
评论会员:游客 时间:2011/12/06
SreekanthMuralidharan

我此编译器错误:
{C}请帮助。


Sreekanth Muralidharan,
顾问企业系统[嵌入式系统],
印度
评论会员:Urquan主 时间:2011/12/06
您好,

atlapp是WTL的设置的一部分。您可以从Microsoft下载WTL的模板通过这个链接]或干脆为"WTL的7.1"搜索微软网站上下载一节。
评论会员:Urquan主 时间:2011/12/06
您好
其实我只是发现了,你需要WTL的8.0来运行这个项目,因为它使用CDoubleBufferImpl我无法找到在WTL 7.1。
你可以在本网站WTL的8.0,而不是{A}

希望它有助于
评论会员:AlanW 时间:2011/12/06
最新(稳定)版本7.5应罚款