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 ); }
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 ); }