📄 treelistheaderctrl.cpp
字号:
{
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 + -