📄 ctrlsharedfolder.cpp
字号:
{
if ( hItem )
{
UINT nNewState = GetItemState( hItem, TVIS_SELECTED ) & TVIS_SELECTED ?
0 : TVIS_SELECTED;
SetItemState( hItem, nNewState, TVIS_SELECTED );
m_hFirstSelected = NULL;
NotifySelectionChanged();
}
}
else if ( ( nFlags & MK_SHIFT ) && m_bMultiSelect )
{
HTREEITEM hItem = HitTest( point );
if ( ! m_hFirstSelected ) m_hFirstSelected = GetFirstSelectedItem();
if ( hItem ) SetItemState( hItem, TVIS_SELECTED, TVIS_SELECTED );
if ( m_hFirstSelected ) SelectItems( m_hFirstSelected, hItem );
NotifySelectionChanged();
}
else
{
BOOL bChanged = FALSE;
BOOL bSelected = hItem && ( GetItemState( hItem, TVIS_SELECTED ) & TVIS_SELECTED );
if ( ! bSelected || ( nFlags & MK_RBUTTON ) == 0 )
{
if ( m_bFirstClick && hItem != GetRootItem() )
{
Select( hItem, TVGN_CARET );
}
bChanged = ClearSelection( hItem );
m_hFirstSelected = NULL;
}
if ( hItem )
{
if ( ! bSelected )
{
SetItemState( hItem, TVIS_SELECTED, TVIS_SELECTED );
bChanged = TRUE;
}
}
if ( bChanged ) NotifySelectionChanged();
}
m_bFirstClick = FALSE;
SetFocus();
}
void CLibraryFolderCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{
UINT nItemFlags = 0;
HTREEITEM hItem = HitTest( point, &nItemFlags );
if ( ( nItemFlags & (TVHT_ONITEMINDENT|TVHT_ONITEMRIGHT|TVHT_NOWHERE) ) && m_bMultiSelect )
{
SelectAll();
}
else
{
NMHDR pNM = { GetSafeHwnd(), GetDlgCtrlID(), NM_DBLCLK };
GetParent()->SendMessage( WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&pNM );
}
}
void CLibraryFolderCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
}
void CLibraryFolderCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
OnLButtonDown( nFlags, point );
OnLButtonUp( nFlags, point );
CTreeCtrl::OnRButtonDown( nFlags, point );
}
void CLibraryFolderCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if ( ( nChar == VK_UP || nChar == VK_DOWN ) && ( GetKeyState( VK_SHIFT ) & 0x8000 ) && m_bMultiSelect )
{
if ( ! m_hFirstSelected )
{
m_hFirstSelected = GetFirstSelectedItem();
ClearSelection( m_hFirstSelected );
}
HTREEITEM hItemPrevSel = GetSelectedItem();
HTREEITEM hItemNext;
if ( nChar == VK_UP )
hItemNext = GetPrevVisibleItem( hItemPrevSel );
else
hItemNext = GetNextVisibleItem( hItemPrevSel );
if ( hItemNext )
{
BOOL bReselect = ! ( GetItemState( hItemNext, TVIS_SELECTED ) & TVIS_SELECTED );
SelectItem( hItemNext );
if ( bReselect ) SetItemState( hItemPrevSel, TVIS_SELECTED, TVIS_SELECTED );
}
NotifySelectionChanged();
return;
}
else if ( nChar >= VK_SPACE )
{
m_hFirstSelected = NULL;
ClearSelection();
}
else if ( nChar == 'A' && ( GetAsyncKeyState( VK_CONTROL ) & 0x8000 ) && m_bMultiSelect )
{
BOOL bChanged = FALSE;
for ( HTREEITEM hItem = GetRootItem() ; hItem != NULL ; hItem = GetNextItem( hItem, TVGN_NEXTVISIBLE ) )
{
if ( ( GetItemState( hItem, TVIS_SELECTED ) & TVIS_SELECTED ) == 0 )
{
SetItemState( hItem, TVIS_SELECTED, TVIS_SELECTED );
bChanged = TRUE;
}
}
if ( bChanged ) NotifySelectionChanged();
return;
}
CTreeCtrl::OnKeyDown( nChar, nRepCnt, nFlags );
}
BOOL CLibraryFolderCtrl::ClearSelection(HTREEITEM hExcept, HTREEITEM hItem, BOOL bSelect)
{
BOOL bChanged = FALSE;
if ( hItem == NULL ) hItem = GetRootItem();
for ( ; hItem != NULL ; hItem = GetNextItem( hItem, TVGN_NEXT ) )
{
BOOL bIsSelected = ( GetItemState( hItem, TVIS_SELECTED ) & TVIS_SELECTED ) ? TRUE : FALSE;
if ( hItem != hExcept && ( bIsSelected != bSelect ) )
{
SetItemState( hItem, bSelect ? TVIS_SELECTED : 0, TVIS_SELECTED );
bChanged = TRUE;
}
HTREEITEM hChild = GetChildItem( hItem );
if ( hChild != NULL ) bChanged |= ClearSelection( hExcept, hChild, bSelect );
}
return bChanged;
}
BOOL CLibraryFolderCtrl::SelectAll(HTREEITEM hExcept)
{
if ( ClearSelection( hExcept, NULL, TRUE ) )
{
NotifySelectionChanged();
return TRUE;
}
return FALSE;
}
BOOL CLibraryFolderCtrl::SelectItems(HTREEITEM hItemFrom, HTREEITEM hItemTo)
{
HTREEITEM hItem = GetRootItem();
while ( hItem && hItem != hItemFrom && hItem != hItemTo )
{
hItem = GetNextVisibleItem( hItem );
SetItemState( hItem, 0, TVIS_SELECTED );
}
if ( ! hItem ) return FALSE;
if ( hItem == hItemTo )
{
hItemTo = hItemFrom;
hItemFrom = hItem;
}
BOOL bSelect = TRUE;
while ( hItem )
{
SetItemState( hItem, bSelect ? TVIS_SELECTED : 0, TVIS_SELECTED );
if( hItem == hItemTo ) bSelect = FALSE;
hItem = GetNextVisibleItem( hItem );
}
return TRUE;
}
BOOL CLibraryFolderCtrl::SelectFolder(CLibraryFolder* pFolder, HTREEITEM hItem)
{
if ( hItem == NULL ) hItem = GetRootItem();
for ( ; hItem != NULL ; hItem = GetNextItem( hItem, TVGN_NEXT ) )
{
if ( pFolder == (CLibraryFolder*)GetItemData( hItem ) )
{
SetItemState( hItem, TVIS_SELECTED, TVIS_SELECTED );
return TRUE;
}
HTREEITEM hChild = GetChildItem( hItem );
if ( hChild != NULL && SelectFolder( pFolder, hChild ) ) return TRUE;
}
return FALSE;
}
HTREEITEM CLibraryFolderCtrl::GetFirstSelectedItem() const
{
for ( HTREEITEM hItem = GetRootItem() ; hItem != NULL ; hItem = GetNextItem( hItem, TVGN_NEXTVISIBLE ) )
{
if ( GetItemState( hItem, TVIS_SELECTED ) & TVIS_SELECTED ) return hItem;
}
return NULL;
}
HTREEITEM CLibraryFolderCtrl::GetNextSelectedItem(HTREEITEM hItem) const
{
for ( hItem = GetNextItem( hItem, TVGN_NEXTVISIBLE ) ; hItem != NULL ; hItem = GetNextItem( hItem, TVGN_NEXTVISIBLE ) )
{
if ( GetItemState( hItem, TVIS_SELECTED ) & TVIS_SELECTED ) return hItem;
}
return NULL;
}
void CLibraryFolderCtrl::OnItemExpanded(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
int nImage = ItemHasChildren( hItem ) && pNMTreeView->itemNew.state & TVIS_EXPANDED;
nImage = nImage ? SHI_FOLDER_OPEN : SHI_FOLDER_CLOSED;
SetItemImage( hItem, nImage, nImage );
if ( m_bSaveExpand && Library.Lock( 50 ) )
{
CLibraryFolder* pFolder = (CLibraryFolder*)GetItemData( hItem );
if ( LibraryFolders.CheckFolder( pFolder, TRUE ) )
{
pFolder->m_bExpanded = ( nImage == 1 );
}
Library.Unlock();
}
}
void CLibraryFolderCtrl::OnSelChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
NotifySelectionChanged();
*pResult = 0;
}
void CLibraryFolderCtrl::NotifySelectionChanged()
{
GetParent()->PostMessage( WM_TIMER, 2 );
}
void CLibraryFolderCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMTVCUSTOMDRAW* pDraw = (NMTVCUSTOMDRAW*)pNMHDR;
if ( pDraw->nmcd.dwDrawStage == CDDS_PREPAINT )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( pDraw->nmcd.dwDrawStage == (CDDS_ITEM|CDDS_PREPAINT) )
{
BOOL bSelected = GetItemState( (HTREEITEM)pDraw->nmcd.dwItemSpec, TVIS_SELECTED ) & TVIS_SELECTED ? TRUE : FALSE;
pDraw->clrText = GetSysColor( bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT );
pDraw->clrTextBk = GetSysColor( bSelected ? COLOR_HIGHLIGHT : COLOR_WINDOW );
*pResult = CDRF_DODEFAULT;
}
}
void CLibraryFolderCtrl::OnNcPaint()
{
CWnd::OnNcPaint();
if ( GetStyle() & WS_BORDER )
{
CWindowDC dc( this );
CRect rc;
COLORREF crBorder = GetSysColor( COLOR_ACTIVECAPTION );
GetWindowRect( &rc );
rc.OffsetRect( -rc.left, -rc.top );
dc.Draw3dRect( &rc, crBorder, crBorder );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -