📄 treelistctrl.cpp
字号:
iCol = m_arShows[iShow];
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[iCol];
if( iCol == iSubItem )
{
CRect rcColumn;
rcColumn.SetRect( 0, rcItem.top, pColumnInfo->GetWidth(), rcItem.bottom );
rcColumn.OffsetRect( nColPos, 0 );
rcColumn.OffsetRect( rcItem.left, 0 );
lpRect->left = rcColumn.left;
lpRect->right = rcColumn.right;
lpRect->top = rcColumn.top;
lpRect->bottom = rcColumn.bottom;
if( iCol == 0 && bTextOnly )
{
if ( m_dwStyle&TLC_TREELIST )
return GetItemRectTree( pItem, lpRect );
else
return GetItemRectMain( pItem, lpRect );
}
// lpRect->left += 1;
// lpRect->right -= 1;
return TRUE;
}
}
}
return FALSE;
}
BOOL CTreeListCtrl::GetItemRectTree( CTreeListItem* pItem, LPRECT lpRect )
{
int nPerfix = 0;
// skip perfix and tree line
nPerfix += TLL_BORDER;
nPerfix += (pItem->m_nLevel-1) * TLL_WIDTH;
// skip tree button
if( m_dwStyle&(TLC_TREELINE|TLC_BUTTON) )
nPerfix += TLL_WIDTH;
// skip tree check box
if( m_dwStyle&TLC_CHECKBOX )
if( pItem->GetState()&TLIS_SHOWCHECKBOX )
nPerfix += TLL_WIDTH;
// skip tree lock box
if( m_dwStyle&TLC_LOCKBOX )
if( pItem->GetState()&TLIS_SHOWLOCKBOX )
nPerfix += TLL_WIDTH/2;
// skip tree image
if( m_dwStyle&TLC_IMAGE )
if( pItem->GetState()&TLIS_SHOWTREEIMAGE )
nPerfix += TLL_WIDTH;
// skip gaps between text and image/loc
if( m_dwStyle&TLC_LOCKBOX || m_dwStyle&TLC_IMAGE )
nPerfix += 2;
if( lpRect->left + nPerfix + 2 <= lpRect->right )
{
lpRect->left += nPerfix;
// lpRect->left += 1;
// lpRect->right -= 1;
return TRUE;
}
lpRect->left += nPerfix;
return FALSE;
}
BOOL CTreeListCtrl::GetItemRectMain( CTreeListItem* pItem, LPRECT lpRect )
{
int nPerfix = 0;
// skip perfix
nPerfix += TLL_BORDER;
// skip tree button
if( m_dwStyle&(TLC_TREELINE|TLC_BUTTON) )
nPerfix += TLL_WIDTH;
// skip tree check box
if( m_dwStyle&TLC_CHECKBOX )
if( pItem->GetState()&TLIS_SHOWCHECKBOX )
nPerfix += TLL_WIDTH;
// skip tree lock box
if( m_dwStyle&TLC_LOCKBOX )
if( pItem->GetState()&TLIS_SHOWLOCKBOX )
nPerfix += TLL_WIDTH/2;
// skip tree image
if( m_dwStyle&TLC_IMAGE )
if( pItem->GetState()&TLIS_SHOWTREEIMAGE )
nPerfix += TLL_WIDTH;
// skip gaps between text and image/loc
if( m_dwStyle&TLC_LOCKBOX || m_dwStyle&TLC_IMAGE )
nPerfix += 2;
if( lpRect->left + nPerfix + 2 <= lpRect->right )
{
lpRect->left += nPerfix;
// lpRect->left += 1;
// lpRect->right -= 1;
return TRUE;
}
lpRect->left += nPerfix;
return FALSE;
}
BOOL CTreeListCtrl::EnsureVisible( CTreeListItem* pItem, int iSubItem )
{
// ensure an item is visible that specified by pItem
int nItem = GetTreeListItem( pItem );
int nFirstRow = GetScrollPos( SB_VERT );
int nShowRows = m_rcTreeList.Height() / GetItemHeight();
if( nShowRows > 0 )
nShowRows = nShowRows - 1;
if( nItem < nFirstRow )
{
SetScrollPos( SB_VERT, nItem );
}
else
{
if( nItem > nFirstRow + nShowRows )
SetScrollPos( SB_VERT, nItem - nShowRows );
}
CRect rcClient;
GetClientRect( rcClient );
int nCurrent = GetScrollPos( SB_HORZ );
int nLeft = 0;
int nRight = 0;
for( int iShow = 0; iShow < m_arShows.GetSize(); iShow ++ )
{
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[m_arShows[iShow]];
if( m_arShows[iShow] == iSubItem )
{
nRight = pColumnInfo->GetWidth();
break;
}
nLeft += pColumnInfo->GetWidth();
}
nRight = nLeft + nRight;
if( iSubItem == 0 )
{
int iLevel = pItem->m_nLevel - 1;
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[0];
nLeft += TLL_WIDTH * iLevel;
}
if( nLeft <= nCurrent )
{
SetScrollPos( SB_HORZ, nLeft );
}
else
{
if( nCurrent + rcClient.Width() < nRight )
{
if( nRight-nLeft <= rcClient.Width() )
{
SetScrollPos( SB_HORZ, nRight - rcClient.Width() );
}
else
{
SetScrollPos( SB_HORZ, nLeft );
}
}
}
Invalidate();
return TRUE;
}
int CTreeListCtrl::GetItemCount()
{
// retrieve count of all items.
return m_pRootItem->m_nChild - 1;
}
int CTreeListCtrl::GetNextItem( int nItem, int nFlags )
{
// retrieve next item specified by nItem
CTreeListItem* pItem = NULL;
pItem = GetTreeListItem( nItem );
if( pItem == NULL )
return -1;
if( nFlags&TLNI_ABOVE )
return GetTreeListItem( GetPrevSiblingItem( pItem ) );
if( nFlags&TLNI_BELOW )
return GetTreeListItem( GetNextSiblingItem( pItem ) );
return -1;
}
POSITION CTreeListCtrl::GetFirstSelectedItemPosition()
{
// retrieve position of selected item
if( m_arSelects.GetSize() == 0 )
return NULL;
POSITION pos = (POSITION)m_pRootItem;
return pos;
}
CTreeListItem* CTreeListCtrl::GetNextSelectedItem( POSITION& pos )
{
// retrieve next selected item specified by pItem
CTreeListItem* pItem;
pItem = GetNextSelectedItem( (CTreeListItem*)pos );
pos = (POSITION)pItem;
return pItem;
}
int CTreeListCtrl::GetStringWidth( LPCTSTR lpsz )
{
// retrieve width of string in pixel
CPaintDC dc(this);
CFont* pOldFont = dc.SelectObject( GetFont() );
CSize sz = dc.GetTextExtent( lpsz, _tcslen(lpsz) );
dc.SelectObject( pOldFont );
return sz.cx + 6;
}
DWORD CTreeListCtrl::SetColumnFormat( int nCol, DWORD dwAdd, DWORD dwRemove )
{
// set column fromat
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
DWORD dwFormat = pColumnInfo->SetFormat( dwAdd, dwRemove );
Invalidate();
return dwFormat;
}
DWORD CTreeListCtrl::GetColumnFormat( int nCol, DWORD dwMask )
{
// retrieve column format
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
return pColumnInfo->GetFormat();
}
DWORD CTreeListCtrl::SetColumnModify( int nCol, DWORD dwModify )
{
// retrieve column modify
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
return pColumnInfo->SetModify( dwModify );
}
DWORD CTreeListCtrl::GetColumnModify( int nCol )
{
// retrieve column modify
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
return pColumnInfo->GetModify();
}
int CTreeListCtrl::SetColumnWidth( int nCol, int nWidth, int nMin, int nMax )
{
// set column width
if( nWidth == TLSCW_AUTOSIZE || nWidth == TLSCW_AUTOSIZE_USEHEADER )
{
// AutoSetWidth(); // all show items
if( nWidth == TLSCW_AUTOSIZE )
{
nWidth = nMin;
}
else
{
nWidth = GetStringWidth( GetColumnText( nCol ) ) + 4;
}
CTreeListItem* pShowItem = GetFirstShowItem( 0 );
while( pShowItem != NULL )
{
ASSERT( pShowItem != NULL );
int x = 0;
if( nCol == 0 )
{
if( m_dwStyle&TLC_TREELIST )
x += (pShowItem->m_nLevel-1) * TLL_WIDTH;
if( m_dwStyle&(TLC_TREELINE|TLC_BUTTON) )
x += TLL_WIDTH;
if( m_dwStyle&TLC_CHECKBOX )
if( pShowItem->GetState()&TLIS_SHOWCHECKBOX )
x += TLL_WIDTH;
if( m_dwStyle&TLC_LOCKBOX )
if( pShowItem->GetState()&TLIS_SHOWLOCKBOX )
x += TLL_WIDTH/2;
if( m_dwStyle&TLC_IMAGE )
if( pShowItem->GetState()&TLIS_SHOWTREEIMAGE )
x += TLL_WIDTH;
if( m_dwStyle&TLC_LOCKBOX || m_dwStyle&TLC_IMAGE )
x += 2;
}
x += GetStringWidth( pShowItem->GetText( nCol ) );
x += 2;
if( nWidth < x )
nWidth = x;
pShowItem = GetNextShowItem( pShowItem );
}
return SetColumnWidth( nCol, nWidth, nMin, nMax );
}
else if( nWidth == TLSCW_AUTOSIZEV || nWidth == TLSCW_AUTOSIZEV_USEHEADER )
{
// AutoSetWidth(); // all visible items
if( nWidth == TLSCW_AUTOSIZEV )
{
nWidth = nMin;
}
else
{
nWidth = GetStringWidth( GetColumnText( nCol ) ) + 4;
}
CTreeListItem* pVisibleItem = GetFirstVisibleItem();
while( pVisibleItem != NULL )
{
ASSERT( pVisibleItem != NULL );
int x = 0;
if( nCol == 0 )
{
if( m_dwStyle&TLC_TREELIST )
x += (pVisibleItem->m_nLevel-1) * TLL_WIDTH;
if( m_dwStyle&(TLC_TREELINE|TLC_BUTTON) )
x += TLL_WIDTH;
if( m_dwStyle&TLC_CHECKBOX )
if( pVisibleItem->GetState()&TLIS_SHOWCHECKBOX )
x += TLL_WIDTH;
if( m_dwStyle&TLC_LOCKBOX )
if( pVisibleItem->GetState()&TLIS_SHOWLOCKBOX )
x += TLL_WIDTH/2;
if( m_dwStyle&TLC_IMAGE )
if( pVisibleItem->GetState()&TLIS_SHOWTREEIMAGE )
x += TLL_WIDTH;
if( m_dwStyle&TLC_LOCKBOX || m_dwStyle&TLC_IMAGE )
x += 2;
}
x += GetStringWidth( pVisibleItem->GetText( nCol ) );
x += 2;
if( nWidth < x )
nWidth = x;
pVisibleItem = GetNextShowItem( pVisibleItem );
}
return SetColumnWidth( nCol, nWidth, nMin, nMax );
}
else
{
// SetWidth()
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
int iRet = pColumnInfo->SetWidth( nWidth, nMin, nMax );
Layout();
Invalidate();
return iRet;
}
}
int CTreeListCtrl::GetColumnWidth( int nCol )
{
// retrieve column width
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
return pColumnInfo->GetWidth();
}
int CTreeListCtrl::SetColumnImage( int nCol, int iImage )
{
// set index of column image
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
int iRet = pColumnInfo->SetImage( iImage );
Invalidate();
return iRet;
}
int CTreeListCtrl::GetColumnImage( int nCol )
{
// retrieve index of column image
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
return pColumnInfo->GetImage();
}
BOOL CTreeListCtrl::SetColumnText( int nCol, LPCTSTR lpszText )
{
// set text of column
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
BOOL bRet = pColumnInfo->SetText( lpszText );
Invalidate();
return bRet;
}
LPCTSTR CTreeListCtrl::GetColumnText( int nCol )
{
// retrieve text of column
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
return pColumnInfo->GetText();
}
BOOL CTreeListCtrl::SetColumnDefaultText( int nCol, LPCTSTR lpszText )
{
// set default text of column
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
return pColumnInfo->SetDefaultText( lpszText );
}
LPCTSTR CTreeListCtrl::GetColumnDefaultText( int nCol )
{
// retrieve default text of column
ASSERT( 0 <= nCol && nCol < m_arColumns.GetSize() );
CTreeListColumnInfo* pColumnInfo;
pColumnInfo = (CTreeListColumnInfo*)m_arColumns[nCol];
return pColumnInfo->GetDefaultText();
}
DWORD CTreeListCtrl::GetItemState( int nItem, DWORD nStateMask )
{
// retrieve item state ( list )
ASSERT( 0 <= nItem && nItem < GetCount() );
return GetItemState( GetTreeListItem(nItem), nStateMask );
}
void CTreeListCtrl::SetItemState( int nItem, DWORD dwAddState, DWORD dwRemoveState )
{
// set item state ( list )
ASSERT( 0 <= nItem && nItem < GetCount() );
SetItemState( GetTreeListItem(nItem), dwAddState, dwRemoveState );
}
void CTreeListCtrl::GetItemImage( int nItem, int& nImage, int& nExpandImage, int& nSelectedImage, int& nExpandSelectedImage )
{
// retrieve index of item image ( list )
ASSERT( 0 <= nItem && nItem < GetCount() );
GetItemImage( GetTreeListItem(nItem), nImage, nExpandImage, nSelectedImage, nExpandSelectedImage );
}
void CTreeListCtrl::SetItemImage( int nItem, int nImage, int nExpandImage, int nSelectedImage, int nExpandSelectedImage )
{
// set index of item image ( list )
ASSERT( 0 <= nItem && nItem < GetCount() );
SetItemImage( GetTreeListItem(nItem), nImage, nExpandImage, nSelectedImage, nExpandSelectedImage );
}
LPCTSTR CTreeListCtrl::GetItemText( int nItem, int nSubItem )
{
// retrieve text of sub item ( list )
ASSERT( 0 <= nItem && nItem < GetCount() );
return GetItemText( GetTreeListItem(nItem), nSubItem );
}
BOOL CTreeListCtrl::SetItemText( int nItem, int nSubItem, LPCTSTR lpszText )
{
// set text of sub item ( list )
ASSERT( 0 <= nItem && nItem < GetCount() );
return SetItemText( GetTreeListItem(nItem), lpszText, nSubItem );
}
DWORD CTreeListCtrl::GetItemData( int nItem )
{
// retrieve data of item ( list )
ASSERT( 0 <= nItem && nItem < GetCount() );
return GetItemData( GetTreeListItem(nItem) );
}
void CTreeListCtrl::SetItemData( int nItem, DWORD dwData )
{
// set data of item ( list )
ASSERT( 0 <= nItem && nItem < GetCount() );
SetItemData( GetTreeListItem(nItem), dwData );
}
BOOL CTreeListCtrl::GetViewRect( LPRECT lpRect )
{
// retrieve list rect ( list )
lpRect->left = m_rcTreeList.left;
lpRect->right = m_rcTreeList.right;
lpRect->top = m_rcTreeList.top;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -