Пример #1
0
void CTextCtrl::OnPaint() 
{
	CSingleLock pLock( &m_pSection, TRUE );
	CRect rcClient, rcLine;
	CPaintDC dc( this );
	
	GetClientRect( &rcClient );

	CFont* pOldFont = (CFont*)dc.SelectObject( &m_pFont );
	
	if ( m_cCharacter.cx == 0 ) m_cCharacter = dc.GetTextExtent( _T("X") );

	BOOL bBottom	= ( m_nPosition >= m_nTotal );
	BOOL bModified	= m_bProcess;

	if ( m_bProcess ) m_nTotal = 0;
	
	int nWidth = ( rcClient.right - 4 ) / m_cCharacter.cx;

	for ( int nLine = 0 ; nLine < m_pLines.GetSize() ; nLine++ )
	{
		CTextLine* pLine = (CTextLine*)m_pLines.GetAt( nLine );

		if ( m_bProcess || ! pLine->m_nLine )
		{
			m_nTotal += pLine->Process( nWidth );
			bModified = TRUE;
		}
	}

	if ( bBottom ) m_nPosition = m_nTotal;
	if ( bModified ) UpdateScroll( TRUE );
	m_bProcess = FALSE;

	dc.SetTextColor( m_crText[0] );
	dc.SetBkColor( m_crBackground );
	dc.SetBkMode( OPAQUE );

	rcLine.CopyRect( &rcClient );
	rcLine.bottom += ( m_nTotal - m_nPosition ) * m_cCharacter.cy;
	rcLine.top = rcLine.bottom - m_cCharacter.cy;

	for ( nLine = m_pLines.GetSize() - 1 ; nLine >= 0 && rcLine.bottom > 0 ; nLine-- )
	{
		CTextLine* pLine = (CTextLine*)m_pLines.GetAt( nLine );

		dc.SetTextColor( m_crText[ pLine->m_nType ] );
		pLine->Paint( &dc, &rcLine );
	}

	if ( rcLine.bottom > 0 )
	{
		rcLine.top = 0;
		dc.FillSolidRect( &rcLine, m_crBackground );
	}

	dc.SelectObject( pOldFont );
}
Пример #2
0
void CTextCtrl::OnPaint()
{
	CRect rcClient;
	GetClientRect( &rcClient );

	CQuickLock pLock( m_pSection );
	CPaintDC dc( this );

	CFont* pOldFont = (CFont*)dc.SelectObject( &m_pFont );

	if ( ! m_nHeight )
	{
		CSize size = dc.GetTextExtent( _T("X") );
		m_nHeight = size.cy += LINE_GAP;
	}

	const int nWidth = rcClient.right - OFFSET;

	BOOL bBottom	= ( m_nPosition >= m_nTotal );
	BOOL bModified	= m_bProcess;

	if ( m_bProcess ) m_nTotal = 0;

	for ( int nLine = 0 ; nLine < m_pLines.GetSize() ; nLine++ )
	{
		CTextLine* pLine = m_pLines.GetAt( nLine );

		if ( m_bProcess || ! pLine->m_nLine )
		{
			m_nTotal += pLine->Process( &dc, nWidth );
			bModified = TRUE;
		}
	}

	if ( bBottom ) m_nPosition = m_nTotal;
	if ( bModified ) UpdateScroll( TRUE );
	m_bProcess = FALSE;

	CRect rcLine( rcClient );
	rcLine.bottom += ( m_nTotal - m_nPosition ) * m_nHeight;
	rcLine.top = rcLine.bottom - m_nHeight;		// Note: Consider multi-line wrap and gap elsewhere

	dc.SetBkMode( OPAQUE );

	for ( INT_PTR nLine = m_pLines.GetSize() - 1 ; nLine >= 0 && rcLine.bottom > 0 ; nLine-- )
	{
		CTextLine* pLine = m_pLines.GetAt( nLine );
		if ( pLine->m_bSelected && Images.m_bmSelected.m_hObject )	// Skinned
		{
			CRect rcPaint( rcLine );
			rcPaint.bottom++;	// Set wider for highlight
			if ( pLine->m_nLine > 1 )
				rcPaint.top -= ( pLine->m_nLine - 1 ) * m_nHeight;
			dc.SetBkMode( TRANSPARENT );
			CoolInterface.DrawWatermark( &dc, &rcPaint, &Images.m_bmSelected, FALSE ); 	// No overdraw
			WORD nType = pLine->m_nType & MSG_SEVERITY_MASK;
			dc.SetTextColor( nType > 2 ? Colors.m_crHighlight : m_crText[ nType ] );
			pLine->Paint( &dc, &rcLine, TRUE );
			dc.SetBkMode( OPAQUE );
		}
		else // Default
		{
			dc.SetTextColor( pLine->m_bSelected ?
				Colors.m_crHiText : m_crText[ pLine->m_nType & MSG_SEVERITY_MASK ] );
			dc.SetBkColor( pLine->m_bSelected ?
				Colors.m_crHighlight : Colors.m_crWindow );	 // ToDo: Fix m_crBackground[ ( pLine->m_nType & MSG_FACILITY_MASK ) >> 8 ]
			pLine->Paint( &dc, &rcLine );
		}
	}

	if ( rcLine.bottom > 0 )
	{
		rcLine.top = 0;
		dc.FillSolidRect( &rcLine, Colors.m_crWindow ); 	// m_crBackground[ 0 ]
	}

	dc.SelectObject( pOldFont );
}