📄 ctrlmatch.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// 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 + -