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

📄 treelistheaderctrl.cpp

📁 一个关于数据结结的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{
			rcImage = rcHeader;
			rcImage.left	= rcHeader.right - TLL_WIDTH;
			rcHeader.right	= rcHeader.right - TLL_WIDTH;
		}
		else if( pColumn->m_dwFormat&TLF_IMAGEALIGN_CENTER )
		{
			rcImage			= rcHeader;
			rcHeader.left	= rcHeader.right;
		}
		else
		{
			rcImage			= rcHeader;
			rcImage.right	= rcHeader.left + TLL_WIDTH;
			rcHeader.left	= rcHeader.left + TLL_WIDTH;
		}

		POINT pt;
		if( !(pColumn->m_dwFormat&TLF_IMAGEALIGN_CENTER) )
		{
			pt.x = rcImage.left;
			pt.y = rcImage.top + ( rcImage.Height() - TLL_HEIGHT )/2;
		}
		else
		{
			pt.x = rcImage.left + ( rcImage.Width() - TLL_WIDTH )/2;
			pt.y = rcImage.top + ( rcImage.Height() - TLL_HEIGHT )/2;
		}

		pDC->IntersectClipRect( rcImage );
		m_pImageList->Draw( pDC, pColumn->m_iImage, pt, ILD_TRANSPARENT );
		::ExtSelectClipRgn( pDC->m_hDC, DEFAULT_HRGN, RGN_COPY );
	}

	rcHeader.DeflateRect( 1, 0, 1, 0 );
	if( rcHeader.Width() <= 0 )
		return TRUE;

	// draw text
	if( pColumn->m_dwFormat&TLF_CAPTION_TEXT )
	{
		pDC->IntersectClipRect( rcHeader );

		int nOldMode = pDC->SetBkMode( TRANSPARENT );
		CFont* pOldFont = pDC->SelectObject( GetHeaderFont() );
		pDC->DrawText( pColumn->m_strCaption, rcHeader, pColumn->GetCaptionFormat() );
		pDC->SelectObject( pOldFont );
		pDC->SetBkMode( nOldMode );

		::ExtSelectClipRgn( pDC->m_hDC, DEFAULT_HRGN, RGN_COPY );
	}		
	return TRUE;
}

void CTreeListHeaderCtrl::PreSubclassWindow() 
{
	// create from subclass
	CWnd::PreSubclassWindow();

	if( m_bSubclassFromCreate == FALSE )
	{
		if( !Create() )
		{
			AfxThrowMemoryException();
			return;
		}
	}

	return;
}

LRESULT CTreeListHeaderCtrl::OnLayout(WPARAM wParam, LPARAM lParam)
{
	// releayout
	CRect* pRect= (CRect*)lParam;
	
	if( pRect->Height() >= GetHeaderHeight() )
	{
		pRect->bottom = pRect->top + GetHeaderHeight();
	}

	MoveWindow( pRect, TRUE );

	return TRUE;
}

void CTreeListHeaderCtrl::OnMouseMove(UINT nFlags, CPoint point) 
{
	// mouse moving
	if( !m_bSizing && !m_bDraging )
	{
		int iFlag;
		int iCol;

		if( HitTestSize( point, &iFlag, &iCol ) )
		{
			if( iFlag & TLHT_ONHEADERSIZE )
			{
				m_bSplit = FALSE;
				SetCursor( m_hSize );
			}
			else
			{
				m_bSplit = TRUE;
				SetCursor( m_hSplit );
			}
		}
	}
	else if( m_bSizing )
	{
		DoSizing( point );
	}
	else if( m_bDraging )
	{
		DoChecking( point );
		DoDraging( point );
	}

	CWnd::OnMouseMove(nFlags, point);
}

void CTreeListHeaderCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// left button down
	m_pTreeListCtrl->SetFocus();

	CWnd::OnLButtonDown(nFlags, point);

	ASSERT( m_bSizing == FALSE );

	if( !m_bSizing && !m_bDraging )
	{
		int iFlag;
		int iCol;
		
		if( HitTestSize( point, &iFlag, &iCol ) )
		{
			m_iCol = iCol;
			BeginSizing( point );
		}
		else if( HitTest( point, &iFlag, &iCol ) )
		{
			if( iFlag&TLHT_ONHEADER )
			{
				m_iCol = iCol;
				BeginDraging( point );
			}
		}
	}
}

void CTreeListHeaderCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// left button up
	if( m_bSizing )
	{
		EndSizing( point );
	}

	if( m_bDraging )
	{
		EndDraging( point );
	}

	CWnd::OnLButtonUp(nFlags, point);
}

void CTreeListHeaderCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	CWnd::OnLButtonDblClk(nFlags, point);

	if( !m_bSizing && !m_bDraging )
	{
		int iFlag;
		int iCol;
		
		if( HitTestSize( point, &iFlag, &iCol ) )
		{
			m_pTreeListCtrl->SetColumnWidth( iCol, TLSCW_AUTOSIZE_USEHEADER );
		}
	}
}

void CTreeListHeaderCtrl::OnCancelMode() 
{
	// cancel internal event
	if( m_bSizing )
	{
		EndSizing();
	}

	if( m_bDraging )
	{
		EndDraging();
	}

	CWnd::OnCancelMode();
}

BOOL CTreeListHeaderCtrl::BeginSizing( CPoint point )
{
	// begin a sizing
	CPtrArray&			arColumns	= m_pTreeListCtrl->m_arColumns;
	CArray<int, int>&	arShows		= m_pTreeListCtrl->m_arShows;

	ASSERT( m_bSizing == FALSE );
	ASSERT( m_bDraging == FALSE );

	m_bSizing = TRUE;
	SetCapture();

	if( !m_bSplit )
		SetCursor( m_hSize );
	else
		SetCursor( m_hSplit );

	CTreeListColumnInfo* pColumnInfo;
	pColumnInfo = (CTreeListColumnInfo*)arColumns[m_iCol];

	int nTrackPos = GetParent()->GetScrollPos( SB_HORZ ) + point.x;
	pColumnInfo->BeginTrack( nTrackPos );

	return TRUE;
}

BOOL CTreeListHeaderCtrl::EndSizing( CPoint point )
{
	// end a sizing
	CPtrArray&			arColumns	= m_pTreeListCtrl->m_arColumns;
	CArray<int, int>&	arShows		= m_pTreeListCtrl->m_arShows;

	m_bSizing = FALSE;

	CTreeListColumnInfo* pColumnInfo;
	pColumnInfo = (CTreeListColumnInfo*)arColumns[m_iCol];
		
	int nTrackPos = GetParent()->GetScrollPos( SB_HORZ ) + point.x;
	pColumnInfo->EndTrack( nTrackPos );

	m_pTreeListCtrl->SetAllScroll();
	m_pTreeListCtrl->RedrawWindow();

	ReleaseCapture();
	return TRUE;
}

BOOL CTreeListHeaderCtrl::DoSizing( CPoint point )
{
	// do a sizing
	CPtrArray&			arColumns	= m_pTreeListCtrl->m_arColumns;
	CArray<int, int>&	arShows		= m_pTreeListCtrl->m_arShows;

	CTreeListColumnInfo* pColumnInfo;
	pColumnInfo = (CTreeListColumnInfo*)arColumns[m_iCol];
		
	int nTrackPos = GetParent()->GetScrollPos( SB_HORZ ) + point.x;
	pColumnInfo->DoTrack( nTrackPos );

	m_pTreeListCtrl->SetAllScroll();
	m_pTreeListCtrl->RedrawWindow();

	return TRUE;
}

BOOL CTreeListHeaderCtrl::BeginDraging( CPoint point )
{
	// begin a draging
	CPtrArray&			arColumns	= m_pTreeListCtrl->m_arColumns;
	CArray<int, int>&	arShows		= m_pTreeListCtrl->m_arShows;

	ASSERT( m_bSizing == FALSE );
	ASSERT( m_bDraging == FALSE );

	if( !(GetStyle()&TLHS_MASKDRAG) )
		return FALSE;

	m_bDraging = TRUE;
	SetCapture();

	CTreeListColumnInfo* pColumnInfo;
	int nPerfix = 0;
	for( int iShow=0; iShow<arShows.GetSize(); iShow++ )
	{
		int iCol = arShows[iShow];
		pColumnInfo = (CTreeListColumnInfo*)arColumns[iCol];
		
		if( iCol == m_iCol )
			break;

		nPerfix += pColumnInfo->m_nWidth;
	}

	CRect rcHeader;
	rcHeader.SetRect( 0, 0, pColumnInfo->m_nWidth, GetHeaderHeight() );
	rcHeader.OffsetRect( -m_pTreeListCtrl->GetScrollPos( SB_HORZ ), 0 );

	m_ptBegin = point;
	m_ptDelta.x = rcHeader.left - point.x ;
	m_ptDelta.y = rcHeader.top - point.y;

	Invalidate();
	UpdateWindow();

	return TRUE;
}

BOOL CTreeListHeaderCtrl::EndDraging( CPoint point )
{
	ASSERT( m_bDraging == TRUE );
	CPtrArray&			 arColumns	= m_pTreeListCtrl->m_arColumns;
	CArray<int, int>&	 arShows	= m_pTreeListCtrl->m_arShows;

	m_bDraging = FALSE;
	ReleaseCapture();

	if( m_pDragWnd != NULL )
	{
		m_pDragWnd->Hide();
		m_pDragWnd->DestroyWindow();
		delete m_pDragWnd;
		m_pDragWnd = NULL;
	}

	if( m_pDropWnd != NULL )
	{
		m_pDropWnd->Hide();
		m_pDropWnd->DestroyWindow();
		delete m_pDropWnd;
		m_pDropWnd = NULL;
	}

	int nFlag;
	int nCol;
	if( HitTestGaps( point, &nFlag, &nCol ) )
	{
		if( nCol != m_iCol )
		{
			int iShow;
			int iDelShow = -1;
			for( iShow = 0; iShow<arShows.GetSize(); iShow++ )
			{
				if( m_iCol == arShows[iShow] )
				{
					iDelShow = iShow;
					break;
				}
			}

			if( iDelShow >= 0 )
			{
				arShows.RemoveAt( iDelShow );
			}

			int iInsShow = -1;
			for( iShow = 0; iShow<arShows.GetSize(); iShow++ )
			{
				if( nCol == arShows[iShow] )
				{
					iInsShow = iShow;
					break;
				}
			}

			if( nFlag&TLHT_ONHEADERRIGHT )
				iInsShow += 1;

			if( iInsShow >= 0 )
			{
				arShows.InsertAt( iInsShow, m_iCol );
			}
		}
	}

	Invalidate();

	m_pTreeListCtrl->Invalidate();

	return TRUE;
}

BOOL CTreeListHeaderCtrl::DoDraging( CPoint point )
{
	CPtrArray&			arColumns	= m_pTreeListCtrl->m_arColumns;
	CTreeListColumnInfo* pColumnInfo;
	pColumnInfo = (CTreeListColumnInfo*)arColumns[m_iCol];

	if( m_pDragWnd == NULL )
	{
		int cx = GetSystemMetrics( SM_CXDRAG );
		int cy = GetSystemMetrics( SM_CYDRAG );

		ASSERT( GetStyle()*TLHS_MASKDRAG );

		CRect rcDrag;
		rcDrag.SetRect( -cx, -cy, cx, cy );
		rcDrag.OffsetRect( m_ptBegin );
		
		if( !rcDrag.PtInRect( point ) )
		{
			
			CRect rcDragWnd;
			GetHeaderRect( rcDragWnd, m_iCol );
			if( GetStyle()&TLHS_FULLDRAG )
			{
				rcDragWnd.OffsetRect( point );
				rcDragWnd.OffsetRect( m_ptDelta );
			}
			else
			{
				rcDragWnd.OffsetRect( point.x, 0 );
				rcDragWnd.OffsetRect( m_ptDelta.x, 0 );
			}
			ClientToScreen( rcDragWnd );

			m_pDragWnd = new CTLHDragWnd;
			m_pDragWnd->Create( rcDragWnd, this, m_iCol );
			m_pDragWnd->Show();
		}		
	}
	else
	{
		CRect rcDragWnd;
		GetHeaderRect( rcDragWnd, m_iCol );
		if( GetStyle()&TLHS_FULLDRAG )
		{
			rcDragWnd.OffsetRect( point );
			rcDragWnd.OffsetRect( m_ptDelta );
		}
		else
		{
			rcDragWnd.OffsetRect( point.x, 0 );
			rcDragWnd.OffsetRect( m_ptDelta.x, 0 );
		}
		ClientToScreen( rcDragWnd );

		m_pDragWnd->MoveWindow( rcDragWnd );
	}

	return TRUE;
}

BOOL CTreeListHeaderCtrl::DoChecking( CPoint point )
{
	CPtrArray&			arColumns	= m_pTreeListCtrl->m_arColumns;
	CArray<int, int>&	arShows		= m_pTreeListCtrl->m_arShows;
	int nWinPos	= m_pTreeListCtrl->GetScrollPos( SB_HORZ );

	int nFlag;
	int nCol;
	int nPos;

	BOOL bShow;

	bShow = HitTestGaps( point, &nFlag, &nCol );

	if( bShow )
	{
		if( m_pDropWnd == NULL )
		{
			m_pDropWnd = new CTLHDropWnd;
			m_pDropWnd->Create( this );
		}

		nPos = 0;
		if( nFlag&TLHT_ONHEADERRIGHT )
		{
			for( int iShow = 0; iShow < arShows.GetSize(); iShow++ )
			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -