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

📄 ctrlmatch.cpp

📁 著名的下载软件核心Shareaza
💻 CPP
📖 第 1 页 / 共 2 页
字号:

/////////////////////////////////////////////////////////////////////////////
// CMatchCtrl column utilities

void CMatchCtrl::InsertColumn(int nColumn, LPCTSTR pszCaption, int nFormat, int nWidth)
{
	HDITEM pItem = { HDI_TEXT|HDI_FORMAT|HDI_WIDTH };
	
	pItem.pszText		= (LPTSTR)pszCaption;
	pItem.cchTextMax	= _tcslen( pszCaption );
	pItem.fmt			= nFormat;
	pItem.cxy			= nWidth;
	
	m_wndHeader.InsertItem( nColumn, &pItem );
}

void CMatchCtrl::SaveColumnState()
{
	HDITEM pItem = { HDI_WIDTH|HDI_ORDER };
	
	CString strOrdering, strWidths, strItem;
	
	for ( int nColumns = 0 ; m_wndHeader.GetItem( nColumns, &pItem ) ; nColumns++ )
	{
		m_wndHeader.GetItem( nColumns, &pItem );
		
		strItem.Format( _T("%.2x"), pItem.iOrder );
		strOrdering += strItem;
		
		strItem.Format( _T("%.4x"), pItem.cxy );
		strWidths += strItem;
	}
	
	int nSort = m_pMatches->m_nSortColumn >= 0 ? 
		( m_pMatches->m_nSortColumn + 1 ) * m_pMatches->m_bSortDir : 0;
	
	LPCTSTR pszName = _T("Null");
	if ( m_pSchema ) pszName = m_pSchema->m_sSingular;
	
	strItem.Format( _T("CMatchCtrl.%s.%s.Ordering"), m_sType, pszName );
	theApp.WriteProfileString( _T("ListStates"), strItem, strOrdering );
	strItem.Format( _T("CMatchCtrl.%s.%s.Widths"), m_sType, pszName );
	theApp.WriteProfileString( _T("ListStates"), strItem, strWidths );
	strItem.Format( _T("CMatchCtrl.%s.%s.Sort"), m_sType, pszName );
	theApp.WriteProfileInt( _T("ListStates"), strItem, nSort );
}

BOOL CMatchCtrl::LoadColumnState()
{
	CString strOrdering, strWidths, strItem;
	
	LPCTSTR pszName = _T("Null");
	if ( m_pSchema ) pszName = m_pSchema->m_sSingular;
	
	strItem.Format( _T("CMatchCtrl.%s.%s.Ordering"), m_sType, pszName );
	strOrdering = theApp.GetProfileString( _T("ListStates"), strItem, _T("") );
	strItem.Format( _T("CMatchCtrl.%s.%s.Widths"), m_sType, pszName );
	strWidths = theApp.GetProfileString( _T("ListStates"), strItem, _T("") );
	strItem.Format( _T("CMatchCtrl.%s.%s.Sort"), m_sType, pszName );
	int nSort = theApp.GetProfileInt( _T("ListStates"), strItem, - MATCH_COL_COUNT - 1 );
	
	HDITEM pItem = { HDI_WIDTH|HDI_ORDER };
	
	if ( _tcsncmp( strWidths, _T("0000"), 4 ) == 0 &&
		 _tcsncmp( strOrdering, _T("00"), 2 ) == 0 )
	{
		strWidths = strWidths.Mid( 4 );
		strOrdering = strOrdering.Mid( 2 );
	}
	
	for ( int nColumns = 0 ; m_wndHeader.GetItem( nColumns, &pItem ) ; nColumns++ )
	{
		if ( strWidths.GetLength() < 4 || strOrdering.GetLength() < 2 ) return FALSE;
		
		_stscanf( strWidths.Left( 4 ), _T("%x"), &pItem.cxy );
		_stscanf( strOrdering.Left( 2 ), _T("%x"), &pItem.iOrder );
		
		strWidths = strWidths.Mid( 4 );
		strOrdering = strOrdering.Mid( 2 );
		
		m_wndHeader.SetItem( nColumns, &pItem );
	}
	
	SetSortColumn( abs( nSort ) - 1, nSort < 0 );
	
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMatchCtrl scrolling

void CMatchCtrl::UpdateScroll(DWORD nScroll)
{
	SCROLLINFO pInfo;
	
	pInfo.cbSize	= sizeof(pInfo);
	pInfo.fMask		= SIF_ALL & ~SIF_TRACKPOS;
	pInfo.nMin		= 0;
	pInfo.nMax		= m_pMatches->m_nItems - 1;
	pInfo.nPage		= m_nPageCount;
	pInfo.nPos		= nScroll < 0xFFFFFFFF ? nScroll : GetScrollPos( SB_VERT );
	pInfo.nPos		= max( 0, min( pInfo.nPos, pInfo.nMax - (int)pInfo.nPage + 1 ) );
	
	SetScrollInfo( SB_VERT, &pInfo, TRUE );
	
	int nColumnWidth = 0;
	
	for ( int nColumn = m_wndHeader.GetItemCount() - 1 ; nColumn >= 0 ; nColumn-- )
	{
		CRect rcCol;
		Header_GetItemRect( m_wndHeader.GetSafeHwnd(), nColumn, &rcCol );
		nColumnWidth = max( nColumnWidth, rcCol.right );
	}
	
	pInfo.fMask		= SIF_ALL & ~SIF_TRACKPOS;
	pInfo.nMin		= 0;
	pInfo.nMax		= nColumnWidth - 1;
	pInfo.nPage		= m_nCurrentWidth;
	pInfo.nPos		= GetScrollPos( SB_HORZ );
	pInfo.nPos		= max( 0, min( pInfo.nPos, pInfo.nMax - (int)pInfo.nPage + 1 ) );
	
	SetScrollInfo( SB_HORZ, &pInfo, TRUE );
	
	CRect rc;
	m_wndHeader.GetWindowRect( &rc );
	ScreenToClient( &rc );
	
	if ( rc.left != -pInfo.nPos || rc.Width() != max( m_nCurrentWidth, pInfo.nMax ) )
	{
		m_wndHeader.SetWindowPos( NULL, -pInfo.nPos, 0,
			max( m_nCurrentWidth, pInfo.nMax ), HEADER_HEIGHT, SWP_NOZORDER );
	}
}

void CMatchCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	switch ( nSBCode )
	{
	case SB_BOTTOM:
		ScrollTo( 0xFFFFFFFF );
		break;
	case SB_LINEDOWN:
		ScrollBy( 1 );
		break;
	case SB_LINEUP:
		ScrollBy( -1 );
		break;
	case SB_PAGEDOWN:
		ScrollBy( m_nPageCount );
		break;
	case SB_PAGEUP:
		ScrollBy( -m_nPageCount );
		break;
	case SB_THUMBPOSITION:
	case SB_THUMBTRACK:
		ScrollTo( nPos );
		break;
	case SB_TOP:
		ScrollTo( 0 );
		break;
	}
}

void CMatchCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	SCROLLINFO pInfo;

	pInfo.cbSize	= sizeof(pInfo);
	pInfo.fMask		= SIF_ALL & ~SIF_TRACKPOS;

	GetScrollInfo( SB_HORZ, &pInfo );
	int nDelta = pInfo.nPos;

	switch ( nSBCode )
	{
	case SB_BOTTOM:
		pInfo.nPos = pInfo.nMax - pInfo.nPage;
		break;
	case SB_LINEDOWN:
		pInfo.nPos ++;
		break;
	case SB_LINEUP:
		pInfo.nPos --;
		break;
	case SB_PAGEDOWN:
		pInfo.nPos += pInfo.nPage;
		break;
	case SB_PAGEUP:
		pInfo.nPos -= pInfo.nPage;
		break;
	case SB_THUMBPOSITION:
	case SB_THUMBTRACK:
		pInfo.nPos = nPos;
		break;
	case SB_TOP:
		pInfo.nPos = 0;
		break;
	}

	pInfo.nPos = max( 0, min( pInfo.nPos, pInfo.nMax - (int)pInfo.nPage + 1 ) );
	if ( pInfo.nPos == nDelta ) return;

	SetScrollInfo( SB_HORZ, &pInfo, TRUE );

	m_wndHeader.SetWindowPos( NULL, -pInfo.nPos, 0,
		max( m_nCurrentWidth, pInfo.nMax ), HEADER_HEIGHT, SWP_NOZORDER );

	RedrawWindow( NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW );
}

BOOL CMatchCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	ScrollBy( zDelta / WHEEL_DELTA * -3 );

	return TRUE;
}

void CMatchCtrl::ScrollBy(int nDelta)
{
	int nIndex = GetScrollPos( SB_VERT ) + nDelta;
	nIndex = max( 0, nIndex );
	ScrollTo( nIndex );
}

void CMatchCtrl::ScrollTo(DWORD nIndex)
{
	DWORD nLimit = m_pMatches->m_nItems;
	if ( nLimit > (DWORD)m_nPageCount ) nLimit -= m_nPageCount;
	else nLimit = 0;
	nIndex = min( nIndex, nLimit );
	
	DWORD nScroll = 0;
	
	m_nTopIndex = 0;
	m_nHitIndex = 0;
	m_nBottomIndex = 0xFFFFFFFF;
	
	CMatchFile** ppFile = m_pMatches->m_pFiles;
	
	for ( DWORD nFiles = 0 ; nFiles < m_pMatches->m_nFiles ; nFiles++, ppFile++ )
	{
		DWORD nCount = (*ppFile)->GetItemCount();
		if ( ! nCount ) continue;
		
		m_nTopIndex = nFiles;
		
		if ( nIndex < nCount )
		{
			m_nHitIndex = nIndex;
			nScroll += nIndex;
			break;
		}
		
		nIndex -= nCount;
		nScroll += nCount;
	}
	
	UpdateScroll( nScroll );
	
	CRect rc;
	GetClientRect( &rc );
	rc.top += HEADER_HEIGHT;
	
	// RedrawWindow( &rc, NULL, RDW_INVALIDATE | RDW_UPDATENOW );
	RedrawWindow( &rc, NULL, RDW_INVALIDATE );
}

/////////////////////////////////////////////////////////////////////////////
// CMatchCtrl painting

BOOL CMatchCtrl::OnEraseBkgnd(CDC* pDC) 
{
	return TRUE;
}

void CMatchCtrl::OnPaint() 
{
	CSingleLock pLock( &m_pMatches->m_pSection );
	
	if ( ! pLock.Lock( 80 ) )
	{
		PostMessage( WM_TIMER, 1 );
		return;
	}
	
	CRect rcClient, rcItem;
	CPaintDC dc( this );
	
	GetClientRect( &rcClient );
	rcClient.top += HEADER_HEIGHT;
	
	dc.SetViewportOrg( -GetScrollPos( SB_HORZ ), 0 );
	
	INT nZeroInt, nColWidth;
	GetScrollRange( SB_HORZ, &nZeroInt, &nColWidth );
	rcClient.right = max( rcClient.right, nColWidth );
	
	CFont* pOldFont = (CFont*)dc.SelectObject( &CoolInterface.m_fntNormal );
	
	m_nTrailWidth = dc.GetTextExtent( _T("

⌨️ 快捷键说明

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