⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 treelistctrl.cpp

📁 一个关于数据结结的
💻 CPP
📖 第 1 页 / 共 5 页
字号:

			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 + -