{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.
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;
这仍然没有解决的选择,如果你点击并拖动另一个项目发生了什么,或者如果您设置或清除该复选框,如果选择另一个项目是。