void CCellListCtrl::OnPaint() { CPaintDC dc(this); // device context for painting int dcStateID = dc.SaveDC(); if (m_hFont != NULL) { dc.SelectObject(CFont::FromHandle(m_hFont)); } CRect rcClient(0,0,0,0); GetClientRect(&rcClient); int eachHeight = GetItemHeightInPixel(&dc); dc.SetTextColor(m_textColor); dc.SetBkColor(m_backColor); int itemCount = GetItemCount(); int columnCount = GetColumnCount(); for (int iItem = 0; iItem < itemCount; ++iItem) { int currentCellLeft = 0; CRect rcLine(0, iItem * eachHeight, rcClient.right, (iItem + 1) * eachHeight); dc.FillSolidRect(&rcLine, dc.GetBkColor()); for (int iColumn = 0; iColumn < columnCount; ++iColumn) { int eachWidth = GetColumnWidth(iColumn); CRect rcCell(currentCellLeft, rcLine.top, currentCellLeft + eachWidth, rcLine.bottom); dc.DrawText(GetItemText(iItem, iColumn), -1, &rcCell, DT_LEFT | DT_NOPREFIX); currentCellLeft += eachWidth; } } dc.RestoreDC(dcStateID); }
QRectF EdgeItem::boundingRect() const { // Calculate the bounding box for the line itself float dx = qAbs(m_line.dx()); float dy = qAbs(m_line.dy()); QRectF rcLine(-dx / 2.0f, -dy / 2.0f, dx, dy); // Factor in the label return QRectF( qMin(rcLine.left(), m_labelRect.left() - LabelOffset), qMin(rcLine.top(), m_labelRect.top() - LabelOffset), qMax(rcLine.width(), m_labelRect.width() + 2*LabelOffset), qMax(rcLine.height(), m_labelRect.height() + 2*LabelOffset)); }
int CTextCtrl::HitTest(const CPoint& pt) const { CQuickLock pLock( m_pSection ); if ( m_nHeight != 0 ) { CRect rcClient; GetClientRect( &rcClient ); CRect rcLine( rcClient ); rcLine.bottom += ( m_nTotal - m_nPosition ) * m_nHeight; for ( int nLine = m_pLines.GetCount() - 1 ; nLine >= 0 && rcLine.bottom > rcClient.top ; nLine-- ) { CTextLine* pLine = m_pLines.GetAt( nLine ); rcLine.top = rcLine.bottom - pLine->m_nLine * m_nHeight; if ( rcLine.PtInRect( pt ) ) return nLine; rcLine.bottom -= pLine->m_nLine * m_nHeight; } } return -1; }
void CCalendarCtrl::DrawHeader(CDC* pDC) { CRect rc; GetClientRect(&rc); rc.bottom = rc.top + CALENDAR_HEADER_HEIGHT; CRect rcLine(rc); rcLine.top = rcLine.bottom-1; for(int i=0; i<CALENDAR_HEADER_HEIGHT; i++) { pDC->FillSolidRect(rcLine, GetFadedBlue(i*4)); rcLine.bottom--; rcLine.top = rcLine.bottom-1; } CFont* pOldFont = pDC->SelectObject(&m_DefaultFont); int nWidth = rc.Width()/CALENDAR_COLUMNS; bool bShort = false; for(i=0; i<CALENDAR_COLUMNS; i++) { CRect txtRect(i*nWidth, 0, (i+1)*nWidth, CALENDAR_HEADER_HEIGHT); CString csTitle(m_dayCells[0][i].date.Format(_T("%A"))); CSize TitleSize(pDC->GetTextExtent(csTitle)); if(TitleSize.cx > txtRect.Width()){ bShort = true; break; } } for(i=0 ; i<CALENDAR_COLUMNS; i++) { CString csTitle(m_dayCells[0][i].date.Format(_T("%A"))); CRect txtRect(i*nWidth, 0, (i+1)*nWidth, CALENDAR_HEADER_HEIGHT); if(bShort) csTitle = csTitle.Left(3); pDC->DrawText(csTitle, txtRect, DT_CENTER|DT_VCENTER); } pDC->SelectObject(pOldFont); }
void CNavPaneWnd::OnPaint() { CPaintDC dc(this); // device context for painting CRect rcClient = ::GetClientRect(this); COLORREF clrBtnface = ::GetSysColor(COLOR_BTNFACE); COLORREF clrTabBg = ChangeBrightness(clrBtnface, 0.85); COLORREF clrHilight = ::GetSysColor(COLOR_BTNHILIGHT); COLORREF clrShadow = ::GetSysColor(COLOR_BTNSHADOW); COLORREF clrFrame = ::GetSysColor(COLOR_WINDOWFRAME); if (m_tabs.empty()) { dc.FillSolidRect(rcClient, clrBtnface); return; } // Draw tabs offscreen CSize szTabs(s_nTabsWidth + 1, rcClient.Height()); m_offscreenDC.Create(&dc, szTabs); CDC* pDC = &m_offscreenDC; CRect rcTabs(rcClient); rcTabs.right = rcTabs.left + s_nTabsWidth; pDC->FillSolidRect(rcTabs, clrTabBg); // Vertical line CRect rcLine(rcTabs.right, rcClient.top, rcTabs.right + 1, rcClient.bottom); pDC->FillSolidRect(rcLine, clrShadow); for (int nDiff = (int)m_tabs.size(); nDiff > 0; --nDiff) { if (m_nActiveTab - nDiff >= 0) DrawTab(pDC, m_nActiveTab - nDiff, false); if (m_nActiveTab + nDiff < static_cast<int>(m_tabs.size())) DrawTab(pDC, m_nActiveTab + nDiff, false); } DrawTab(pDC, m_nActiveTab, true); // Flush bitmap to screen dc dc.BitBlt(0, 0, szTabs.cx, szTabs.cy, pDC, 0, 0, SRCCOPY); m_offscreenDC.Release(); // Left space rcTabs.left = rcTabs.right + 1; rcTabs.right = rcTabs.left + s_nLeftMargin; dc.FillSolidRect(rcTabs, clrBtnface); if (m_tabs[m_nActiveTab].bHasBorder) { rcLine.OffsetRect(s_nLeftMargin + 1, 0); rcLine.top += s_nTopMargin; dc.FillSolidRect(rcLine, clrShadow); } // Top space rcTabs.right = rcClient.right; rcTabs.bottom = rcTabs.top + s_nTopMargin; dc.FillSolidRect(rcTabs, clrBtnface); if (m_tabs[m_nActiveTab].bHasBorder) { rcLine.right = rcClient.right; rcLine.bottom = rcLine.top + 1; dc.FillSolidRect(rcLine, clrShadow); } if (rcClient.Width() > 70) { // Close button if (m_hTheme != NULL) { if (m_bClosePressed) XPDrawThemeBackground(m_hTheme, dc.m_hDC, TP_BUTTON, TS_PRESSED, m_rcClose, NULL); else if (m_bCloseActive) XPDrawThemeBackground(m_hTheme, dc.m_hDC, TP_BUTTON, TS_HOT, m_rcClose, NULL); } else { if (m_bClosePressed) dc.Draw3dRect(m_rcClose, clrShadow, clrHilight); else if (m_bCloseActive) dc.Draw3dRect(m_rcClose, clrHilight, clrShadow); } CPoint ptOffset(m_rcClose.left + (m_rcClose.Width() - 10) / 2, m_rcClose.top + (m_rcClose.Height() - 10) / 2); if (m_bClosePressed) ptOffset.Offset(1, m_hTheme != NULL ? 0 : 1); m_imgClose.Draw(&dc, 0, ptOffset, ILD_NORMAL); // Settings button if (m_nActiveTab != -1 && m_tabs[m_nActiveTab].bHasSettings) { if (m_hTheme != NULL) { if (m_bSettingsPressed) XPDrawThemeBackground(m_hTheme, dc.m_hDC, TP_BUTTON, TS_PRESSED, m_rcSettings, NULL); else if (m_bSettingsActive) XPDrawThemeBackground(m_hTheme, dc.m_hDC, TP_BUTTON, TS_HOT, m_rcSettings, NULL); } else { if (m_bSettingsPressed) dc.Draw3dRect(m_rcSettings, clrShadow, clrHilight); else if (m_bSettingsActive) dc.Draw3dRect(m_rcSettings, clrHilight, clrShadow); } CPoint ptOffset2(m_rcSettings.left + (m_rcSettings.Width() - 10) / 2, m_rcSettings.top + (m_rcSettings.Height() - 10) / 2); if (m_bSettingsPressed) ptOffset2.Offset(1, m_hTheme != NULL ? 0 : 1); m_imgSettings.Draw(&dc, 0, ptOffset2, ILD_NORMAL); } } }
void CNavPaneWnd::DrawTab(CDC* pDC, int nTab, bool bActive) { Tab& tab = m_tabs[nTab]; COLORREF clrBtnface = ::GetSysColor(COLOR_BTNFACE); COLORREF clrTabBg = ChangeBrightness(clrBtnface, 0.85); COLORREF clrHilight = ::GetSysColor(COLOR_BTNHILIGHT); COLORREF clrShadow = ::GetSysColor(COLOR_BTNSHADOW); COLORREF clrFrame = ::GetSysColor(COLOR_WINDOWFRAME); COLORREF clrText = ::GetSysColor(COLOR_WINDOWTEXT); CBrush brushBtnface(clrBtnface); CPen penBtnface(PS_SOLID, 1, clrBtnface); CPen penShadow(PS_SOLID, 1, clrShadow); CPen penHilight(PS_SOLID, 1, clrHilight); CRect rcTab = tab.rcTab; rcTab.bottom += s_nTabSize / 2 - 2; pDC->FillSolidRect(rcTab, clrBtnface); // Vertical line CRect rcLine(rcTab.left, rcTab.top, rcTab.left + 1, rcTab.bottom); pDC->FillSolidRect(rcLine, clrShadow); // Horizontal line CRect rcHorzLine(rcTab.left, rcTab.bottom, rcTab.right, rcTab.bottom + 1); pDC->FillSolidRect(rcHorzLine, clrShadow); CPoint points[] = { CPoint(rcTab.left, rcTab.top - 1), CPoint(rcTab.right - 1, rcTab.top - s_nTabSize + 1), CPoint(rcTab.right - 1, rcTab.top - 1) }; CBrush* pOldBrush = pDC->SelectObject(&brushBtnface); CPen* pOldPen = pDC->SelectObject(&penBtnface); pDC->SetPolyFillMode(WINDING); pDC->Polygon(points, 3); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen); CPoint points2[] = { CPoint(rcTab.left, rcTab.top - 1), CPoint(rcTab.right + 1, rcTab.top - s_nTabSize - 1) }; pOldPen = pDC->SelectObject(&penShadow); pDC->Polyline(points2, 2); pDC->SelectObject(pOldPen); if (bActive) { rcLine.OffsetRect(s_nTabSize - 1, 0); rcLine.top -= s_nTabSize - 1; pDC->FillSolidRect(rcLine, clrBtnface); } CFont* pOldFont = pDC->SelectObject(bActive ? &m_fontActive : &m_font); pDC->SetTextColor(clrText); pDC->SetBkMode(TRANSPARENT); pDC->SetTextAlign(TA_CENTER | TA_BASELINE); pDC->TextOut(tab.rcTab.right - 4, tab.rcTab.CenterPoint().y, tab.strName); pDC->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 ); }
void CLibraryAlbumView::OnPaint() { CPaintDC dc( this ); CRect rcBuffer( 0, 0, m_szTrack.cx, m_szTrack.cy ); CDC* pBuffer = CoolInterface.GetBuffer( dc, m_szTrack ); if ( Settings.General.LanguageRTL ) pBuffer->SetTextAlign( TA_RTLREADING ); CFont* pOldFont = (CFont*)pBuffer->SelectObject( &CoolInterface.m_fntNormal ); pBuffer->SetBkMode( OPAQUE ); pBuffer->SetBkColor( Colors.m_crWindow ); pBuffer->SetTextColor( Colors.m_crText ); m_crRows[0] = CColors::CalculateColor( Colors.m_crWindow, Colors.m_crSchemaRow[0], 128 ); m_crRows[1] = CColors::CalculateColor( Colors.m_crWindow, Colors.m_crSchemaRow[1], 128 ); CRect rcClient, rcTrack; GetClientRect( &rcClient ); rcTrack = rcBuffer; rcTrack.OffsetRect( rcClient.left, 0 ); CLibraryAlbumTrack** pList = m_pList; // Column headers pBuffer->SelectObject( &CoolInterface.m_fntBold ); CRect rcLine(rcTrack); rcLine.left += ICON_WIDTH; rcLine.right -= RATING_WIDTH; pBuffer->FillSolidRect( &rcBuffer, Colors.m_crWindow ); if ( m_pStyle == CSchema::uriMusicAlbum ) { // Track, Title, Length, Bitrate CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 0, 5, IDS_LIBRARY_ALBUM_TRACK, TRUE ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 5, 84, IDS_LIBRARY_ALBUM_TITLE ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 84, 92, IDS_LIBRARY_ALBUM_LENGTH, TRUE ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 92, 100, IDS_LIBRARY_ALBUM_BITRATE, TRUE ); } else if ( m_pStyle == CSchema::uriMusicArtist ) { // Album, Title, Length, Bitrate CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 0, 30, IDS_LIBRARY_ALBUM_ALBUM ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 30, 84, IDS_LIBRARY_ALBUM_TITLE ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 84, 92, IDS_LIBRARY_ALBUM_LENGTH, TRUE ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 92, 100, IDS_LIBRARY_ALBUM_BITRATE, TRUE ); } else if ( m_pStyle == CSchema::uriMusicAll ) // Genre { // Artist, Album, Title, Length, Bitrate CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 0, 25, IDS_LIBRARY_ALBUM_ARTIST ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 25, 50, IDS_LIBRARY_ALBUM_ALBUM ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 50, 84, IDS_LIBRARY_ALBUM_TITLE ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 84, 92, IDS_LIBRARY_ALBUM_LENGTH, TRUE ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 92, 100, IDS_LIBRARY_ALBUM_BITRATE, TRUE ); } else // Non-music { // Title, Artist, Length CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 0, 66, IDS_LIBRARY_ALBUM_TITLE ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 66, 88, IDS_LIBRARY_ALBUM_ARTIST ); CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 88, 100, IDS_TIP_SIZE, TRUE ); } // Rating rcLine.left = rcLine.right; rcLine.right += RATING_WIDTH; CLibraryAlbumTrack::PaintText( pBuffer, rcLine, 0, 100, IDS_LIBRARY_ALBUM_RATING, TRUE ); pBuffer->SelectObject( &CoolInterface.m_fntNormal ); dc.BitBlt( rcTrack.left, rcTrack.top, rcBuffer.right, rcBuffer.bottom, pBuffer, 0, 0, SRCCOPY ); dc.ExcludeClipRect( &rcTrack ); rcTrack.OffsetRect( 0, rcClient.top - m_nScroll ); rcTrack.OffsetRect( 0, m_szTrack.cy ); for ( int nItem = 0 ; nItem < m_nCount && rcTrack.top < rcClient.bottom ; nItem++, pList++ ) { CLibraryAlbumTrack* pTrack = *pList; if ( rcTrack.bottom >= rcClient.top && dc.RectVisible( &rcTrack ) ) { pBuffer->FillSolidRect( &rcBuffer, Colors.m_crWindow ); pTrack->Paint( this, pBuffer, rcBuffer, nItem ); dc.BitBlt( rcTrack.left, rcTrack.top, rcBuffer.right, rcBuffer.bottom, pBuffer, 0, 0, SRCCOPY ); dc.ExcludeClipRect( &rcTrack ); } rcTrack.OffsetRect( 0, m_szTrack.cy ); } pBuffer->SelectObject( pOldFont ); dc.FillSolidRect( &rcClient, Colors.m_crWindow ); }
void CLibraryAlbumTrack::Paint(CLibraryAlbumView* pView, CDC* pDC, const CRect& rcTrack, int nCount) { COLORREF crBack = m_bSelected ? Colors.m_crHighlight : CLibraryAlbumView::m_crRows[ nCount & 1 ]; pDC->SetBkColor( crBack ); pDC->SetTextColor( m_bSelected ? Colors.m_crHiText : Colors.m_crText ); CRect rcLine( &rcTrack ); rcLine.DeflateRect( 2, 1 ); // Icon Box CRect rcTemp( rcLine.left, rcLine.top, rcLine.left + ICON_WIDTH, rcLine.bottom ); rcLine.left += ICON_WIDTH; if ( nCount >= 0 ) PaintText( pDC, rcTemp, 0, 100, NULL ); ShellIcons.Draw( pDC, m_nShell, 16, rcTemp.left + 4, ( rcTemp.top + rcTemp.bottom ) / 2 - 8, CLR_NONE, m_bSelected ); // Rating Stars Box rcTemp.SetRect( rcLine.right - RATING_WIDTH, rcLine.top, rcLine.right, rcLine.bottom ); rcLine.right -= RATING_WIDTH; CPoint ptStar( rcTemp.left + 4, ( rcTemp.top + rcTemp.bottom ) / 2 - 6 ); PaintText( pDC, rcTemp, 0, 100, NULL, TRUE ); if ( pView->m_pRating == this && m_nSetRating < 7 ) { for ( int nRating = 2 ; nRating <= 6 ; nRating++ ) { ImageList_DrawEx( pView->m_pStars, m_nSetRating >= nRating ? 2 : 1, *pDC, ptStar.x, ptStar.y, 12, 12, m_bSelected ? CLR_NONE : crBack, crBack, m_nSetRating >= nRating ? ILD_NORMAL : ILD_BLEND50 ); ptStar.x += 12; } } else { for ( int nRating = 2 ; nRating <= 6 ; nRating++ ) { ImageList_DrawEx( pView->m_pStars, m_nRating >= nRating ? 0 : 1, *pDC, ptStar.x, ptStar.y, 12, 12, m_bSelected ? CLR_NONE : crBack, crBack, m_nRating >= nRating ? ILD_NORMAL : ILD_BLEND50 ); ptStar.x += 12; } } ptStar.x++; // Comment icon gap if ( pView->m_pRating == this && m_nSetRating == 7 ) { ImageList_DrawEx( pView->m_pStars, 5, *pDC, ptStar.x, ptStar.y, 12, 12, CLR_NONE, crBack, ILD_NORMAL ); } else { ImageList_DrawEx( pView->m_pStars, m_bComments ? 3 : 4, *pDC, ptStar.x, ptStar.y, 12, 12, m_bSelected ? CLR_NONE : crBack, crBack, m_bComments ? ILD_NORMAL : ILD_BLEND50 ); } // Metadata Boxes (Available space %) if ( pView->m_pStyle == CSchema::uriMusicAlbum ) { // Track, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 5, &m_sTrack, TRUE ); PaintText( pDC, rcLine, 5, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } else if ( pView->m_pStyle == CSchema::uriMusicArtist ) { // Album, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 30, &m_sAlbum ); PaintText( pDC, rcLine, 30, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } else if ( pView->m_pStyle == CSchema::uriMusicAll ) // Genre { // Artist, Album, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 25, &m_sArtist ); PaintText( pDC, rcLine, 25, 50, &m_sAlbum ); PaintText( pDC, rcLine, 50, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } else // Non-music { // Title, Artist, Length PaintText( pDC, rcLine, 0, 66, &m_sTitle ); PaintText( pDC, rcLine, 66, 88, &m_sArtist ); PaintText( pDC, rcLine, 88, 100, &m_sLength, TRUE ); } }
void CCalendarCtrl::DrawCells(CDC* pDC) { CRect rc; GetClientRect(&rc); int ncHeight = (rc.Height()-CALENDAR_HEADER_HEIGHT)/CALENDAR_ROWS; int ncWidth = rc.Width()/CALENDAR_COLUMNS; CPen whitePen(PS_SOLID, 1, RGB(255,255,255)); CPen blackPen(PS_SOLID, 1, RGB(0,0,0)); CFont* pOldFont = pDC->SelectObject(&m_DefaultFont); CPen* pOldPen = pDC->SelectObject(&blackPen); for(int i=0; i<CALENDAR_ROWS ; i++) { for(int u=0; u<CALENDAR_COLUMNS ; u++) { CRect rect; if(GetRectFromCell(i, u, rect)) { if(u == CALENDAR_COLUMNS-1) rect.right = rc.right; if(i == CALENDAR_ROWS-1) rect.bottom = rc.bottom; if((m_bMonthIsOdd && !(m_dayCells[i][u].date.GetMonth()%2)) || (!m_bMonthIsOdd && (m_dayCells[i][u].date.GetMonth()%2))) { CBrush br; br.CreateSolidBrush(CALENDAR_LIGHTGREY); pDC->FillRect(&rect ,&br); } COleDateTime today(time(NULL)); bool btoday = false; if(today.GetDay() == m_dayCells[i][u].date.GetDay() && today.GetMonth() == m_dayCells[i][u].date.GetMonth() && today.GetYear() == m_dayCells[i][u].date.GetYear()) { // Draw the frame CRect rcLine(rect); rcLine.bottom = rcLine.top+15; rcLine.top = rcLine.bottom-1; for(int c=0; c<15; c++) { pDC->FillSolidRect(rcLine, GetFadedBlue(c*6)); rcLine.bottom--; rcLine.top = rcLine.bottom-1; } btoday = true; } // Draw the selection bool bSelected = false; time_t tmax = max(m_SelectionRange[0], m_SelectionRange[1]); time_t tmin = min(m_SelectionRange[0], m_SelectionRange[1]); time_t tcur = DateToSeconds(m_dayCells[i][u].date); if(m_RandomSelection.GetCount()) { POSITION pos = m_RandomSelection.GetStartPosition(); while (pos){ void* p; DWORD date; m_RandomSelection.GetNextAssoc(pos, (void*&)date, p); if(date == (DWORD)tcur) { CBrush br; br.CreateSolidBrush(GetFadedBlue(70)); CRect selRect(rect); if(btoday) selRect.top += 15; pDC->FillRect(&selRect, &br); bSelected = true; } } if(m_SelectionRange[2] == tcur) { rect.left+=2; rect.right -=1; rect.top+=2; rect.bottom -=1; pDC->DrawFocusRect(rect); } } else if((tmax >= tcur) && (tcur >= tmin)) { CRect selRect(rect); CBrush br; br.CreateSolidBrush(GetFadedBlue(70)); if(btoday) selRect.top += 15; pDC->FillRect(&selRect, &br); bSelected = true; } // Out of range if( (m_dayCells[i][u].date >= m_BoundUp) || (m_dayCells[i][u].date <= m_BoundDown) ) { CRect selRect(rect); CBrush br; br.CreateSolidBrush(RGB(255,225,225)); pDC->FillRect(&selRect, &br); } if(m_dayCells[i][u].bMark) { CBrush br; br.CreateSolidBrush(RGB(255,104,4)); CRect rcMark(rect); rcMark.DeflateRect(3,3); rcMark.right = rcMark.left +6; rcMark.bottom = rcMark.top +6; pDC->FillRect(&rcMark, &br); } // draw inside... rect.DeflateRect(1,1); CString csDay; int nDay = m_dayCells[i][u].date.GetDay(); if(nDay == 1 || (i==0 && u==0)) { csDay.Format(_T("%s %d"), m_dayCells[i][u].date.Format(_T("%B")), nDay); CSize dtSize(pDC->GetTextExtent(csDay)); if(dtSize.cx>rect.Width()) csDay.Format(_T("%s %d"), m_dayCells[i][u].date.Format(_T("%b")), nDay); } else csDay.Format(_T("%d"), nDay); unsigned long nColor; if(bSelected && !btoday) nColor = pDC->SetTextColor(RGB(255,104,4)); else nColor = pDC->SetTextColor(RGB(0,0,0)); pDC->DrawText(csDay, rect, DT_RIGHT|DT_TOP); pDC->SetTextColor(nColor); // Draw the cell content if possible if(rect.Width() >= 15) { for (int j=0; j<m_dayCells[i][u].csaLines.GetSize(); j++) { CRect txtRect(rect); CRect dotRect(rect); txtRect.left += 9; //CALENDAR_LINE_HEIGHT; txtRect.right-= 2; txtRect.top += (j+1)*CALENDAR_LINE_HEIGHT; dotRect.top += (j+1)*CALENDAR_LINE_HEIGHT+(CALENDAR_LINE_HEIGHT/2-1); dotRect.bottom = dotRect.top + 3; dotRect.left += 3; dotRect.right = dotRect.left +3; m_dayCells[i][u].bPartial = false; if(!m_dayCells[i][u].csaLines[j].IsEmpty() && txtRect.Height() > CALENDAR_LINE_HEIGHT) { pDC->SetTextColor(RGB(0,0,0)); pDC->DrawText(m_dayCells[i][u].csaLines[j], txtRect, DT_LEFT|DT_TOP); CBrush br; br.CreateSolidBrush(RGB(125,175,255)); pDC->FillRect(&dotRect, &br); } else if(!m_dayCells[i][u].csaLines[j].IsEmpty()) { CPen dotPen(PS_SOLID, 1, RGB(170,170,170)); pDC->SelectObject(&dotPen); // Draw a little arrow static int t[2][7] = {5,5,8,8,8,5,5,4,3,2,1,2,3,4}; int n = 0; for(int r=7; r>0; r--){ pDC->MoveTo(rect.right-9+r, rect.bottom-t[0][n]); pDC->LineTo(rect.right-9+r, rect.bottom-t[1][n]); n++; } m_dayCells[i][u].bPartial = true; break; } } } } } } pDC->SelectObject(pOldFont); pDC->SelectObject(pOldPen); }
void CLibraryAlbumTrack::Paint(CLibraryAlbumView* pView, CDC* pDC, const CRect& rcTrack, int nCount) { COLORREF crBack1 = CLibraryAlbumView::m_crRows[ nCount & 1 ]; COLORREF crBack2 = m_bSelected ? CoolInterface.m_crHighlight : crBack1; CRect rcLine( &rcTrack ); rcLine.DeflateRect( 1, 1 ); rcLine.left ++; rcLine.right --; CRect rcTemp( rcLine.left, rcLine.top, rcLine.left + 22, rcLine.bottom ); rcLine.left += 22; pDC->SetBkColor( m_bSelected ? crBack2 : crBack1 ); ShellIcons.Draw( pDC, m_nShell, 16, rcTemp.left + 3, ( rcTemp.top + rcTemp.bottom ) / 2 - 8, CLR_NONE, m_bSelected ); pDC->SetTextColor( m_bSelected ? CoolInterface.m_crHiText : CoolInterface.m_crText ); rcTemp.SetRect( rcLine.right - 78, rcLine.top, rcLine.right, rcLine.bottom ); rcLine.right -= 78; CPoint ptStar( rcTemp.left + 3, ( rcTemp.top + rcTemp.bottom ) / 2 - 6 ); PaintText( pDC, rcTemp, 0, 100, NULL ); if ( pView->m_pRating == this && m_nSetRating < 7 ) { for ( int nRating = 2 ; nRating <= 6 ; nRating++ ) { ImageList_DrawEx( pView->m_pStars, m_nSetRating >= nRating ? 2 : 1, *pDC, ptStar.x, ptStar.y, 12, 12, crBack2, crBack2, m_nSetRating >= nRating ? ILD_NORMAL : ILD_BLEND50 ); ptStar.x += 12; } } else { for ( int nRating = 2 ; nRating <= 6 ; nRating++ ) { ImageList_DrawEx( pView->m_pStars, m_nRating >= nRating ? 0 : 1, *pDC, ptStar.x, ptStar.y, 12, 12, crBack2, crBack2, m_nRating >= nRating ? ILD_NORMAL : ILD_BLEND50 ); ptStar.x += 12; } } if ( pView->m_pRating == this && m_nSetRating == 7 ) { ImageList_DrawEx( pView->m_pStars, 5, *pDC, ptStar.x, ptStar.y, 12, 12, crBack2, crBack2, ILD_NORMAL ); } else { ImageList_DrawEx( pView->m_pStars, m_bComments ? 3 : 4, *pDC, ptStar.x, ptStar.y, 12, 12, crBack2, crBack2, m_bComments ? ILD_NORMAL : ILD_BLEND50 ); } if ( pView->m_pStyle == CSchema::uriMusicAlbum ) { // Track, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 5, &m_sTrack, TRUE ); PaintText( pDC, rcLine, 5, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } else if ( pView->m_pStyle == CSchema::uriMusicArtist ) { // Album, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 30, &m_sAlbum ); PaintText( pDC, rcLine, 30, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } else { // Artist, Album, Title, Length, Bitrate PaintText( pDC, rcLine, 0, 25, &m_sArtist ); PaintText( pDC, rcLine, 25, 50, &m_sAlbum ); PaintText( pDC, rcLine, 50, 84, &m_sTitle ); PaintText( pDC, rcLine, 84, 92, &m_sLength, TRUE ); PaintText( pDC, rcLine, 92, 100, &m_sBitrate, TRUE ); } }
void CToolTipCtrlX::CustomPaint(LPNMTTCUSTOMDRAW pNMCD) { CWnd* pwnd = CWnd::FromHandle(pNMCD->nmcd.hdr.hwndFrom); CDC* pdc = CDC::FromHandle(pNMCD->nmcd.hdc); // Windows Vista (General) // ----------------------- // *Need* to use (some aspects) of the 'TOOLTIP' theme to get typical Vista tooltips. // // Windows Vista *without* SP1 // --------------------------- // The Vista 'TOOLTIP' theme offers a bold version of the standard tooltip font via // the TTP_STANDARDTITLE part id. Furthermore TTP_STANDARDTITLE is the same font as // the standard tooltip font (TTP_STANDARD). So, the 'TOOLTIP' theme can get used // thoroughly. // // Windows Vista *with* SP1 // ------------------------ // The Vista SP1(!) 'TOOLTIP' theme does though *not* offer a bold font. Keep // in mind that TTP_STANDARDTITLE does not return a bold font. Keep also in mind // that TTP_STANDARDTITLE is even a *different* font than TTP_STANDARD! // Which means, that TTP_STANDARDTITLE should *not* be used within the same line // as TTP_STANDARD. It just looks weird. TTP_STANDARDTITLE could be used for a // single line (the title line), but it would though not give us a bold font. // So, actually we can use the Vista 'TOOLTIP' theme only for getting the proper // tooltip background. // // Windows XP // ---------- // Can *not* use the 'TOOLTIP' theme at all because it would give us only a (non-bold) // black font on a white tooltip window background. Seems that the 'TOOLTIP' theme under // WinXP is just using the default Window values (black+white) and does not // use any of the tooltip specific Window metrics... // bool bUseEmbeddedThemeFonts = false; HTHEME hTheme = NULL; if (theApp.IsVistaThemeActive()) { hTheme = OpenThemeData(*pwnd, L"TOOLTIP"); // Using the theme's fonts works only under Vista without SP1. When SP1 // is installed the fonts which are used for TTP_STANDARDTITLE and TTP_STANDARD // do no longer match (should not get displayed within the same text line). if (hTheme) bUseEmbeddedThemeFonts = true; } CString strText; pwnd->GetWindowText(strText); CRect rcWnd; pwnd->GetWindowRect(&rcWnd); CFont* pOldDCFont = NULL; if (hTheme == NULL || !bUseEmbeddedThemeFonts) { // If we have a theme, we try to query the correct fonts from it if (m_fontNormal.m_hObject == NULL && hTheme) { // Windows Vista Ultimate, 6.0.6001 SP1 Build 6001, English with German Language Pack // ---------------------------------------------------------------------------------- // TTP_STANDARD, TTSS_NORMAL // Height -12 // Weight 400 // CharSet 1 // Quality 5 // FaceName "Segoe UI" // // TTP_STANDARDTITLE, TTSS_NORMAL // Height -12 // Weight 400 // CharSet 1 // Quality 5 // FaceName "Segoe UI Fett" (!!!) Note: "Fett" (that is German !?) // // That font name ("Segoe UI *Fett*") looks quite suspicious. I would not be surprised // if that eventually leads to a problem within the font mapper which may not be capable // of finding the (english) version of that font and thus falls back to the standard // system font. At least this would explain why the TTP_STANDARD and TTP_STANDARDTITLE // fonts are *different* on that particular Windows Vista system. LOGFONT lf = {0}; if (GetThemeFont(hTheme, pdc->m_hDC, TTP_STANDARD, TTSS_NORMAL, TMT_FONT, &lf) == S_OK) { VERIFY( m_fontNormal.CreateFontIndirect(&lf) ); if (m_bCol1Bold && m_fontBold.m_hObject == NULL) { memset(&lf, 0, sizeof(lf)); if (GetThemeFont(hTheme, pdc->m_hDC, TTP_STANDARDTITLE, TTSS_NORMAL, TMT_FONT, &lf) == S_OK) VERIFY( m_fontBold.CreateFontIndirect(&lf) ); } // Get the tooltip font color COLORREF crText; if (GetThemeColor(hTheme, TTP_STANDARD, TTSS_NORMAL, TMT_TEXTCOLOR, &crText) == S_OK) m_crTooltipTextColor = crText; } } // If needed, create the standard tooltip font which was queried from the system metrics if (m_fontNormal.m_hObject == NULL && m_lfNormal.lfHeight != 0) VERIFY( m_fontNormal.CreateFontIndirect(&m_lfNormal) ); // Select the tooltip font if (m_fontNormal.m_hObject != NULL) { pOldDCFont = pdc->SelectObject(&m_fontNormal); // If needed, create the bold version of the tooltip font by deriving it from the standard font if (m_bCol1Bold && m_fontBold.m_hObject == NULL) { LOGFONT lf; m_fontNormal.GetLogFont(&lf); lf.lfWeight = FW_BOLD; VERIFY( m_fontBold.CreateFontIndirect(&lf) ); } } // Set the font color (queried from system metrics or queried from theme) pdc->SetTextColor(m_crTooltipTextColor); } // Auto-format the text only if explicitly requested. Otherwise we would also format // single line tooltips for regular list items, and if those list items contain ':' // characters they would be shown partially in bold. For performance reasons, the // auto-format is to be requested by appending the TOOLTIP_AUTOFORMAT_SUFFIX_CH // character. Appending, because we can remove that character efficiently without // re-allocating the entire string. bool bAutoFormatText = strText.GetLength() > 0 && strText[strText.GetLength() - 1] == TOOLTIP_AUTOFORMAT_SUFFIX_CH; if (bAutoFormatText) strText.Truncate(strText.GetLength() - 1); // truncate the TOOLTIP_AUTOFORMAT_SUFFIX_CH char by setting it to NUL bool bShowFileIcon = m_bShowFileIcon && bAutoFormatText; if (bShowFileIcon) { int iPosNL = strText.Find(_T('\n')); if (iPosNL > 0) { int iPosColon = strText.Find(_T(':')); if (iPosColon < iPosNL) bShowFileIcon = false; // 1st line does not contain a filename } } int iTextHeight = 0; int iMaxCol1Width = 0; int iMaxCol2Width = 0; int iMaxSingleLineWidth = 0; CSize sizText(0); int iPos = 0; int iCaptionHeight = 0; const int iCaptionEnd = bShowFileIcon ? max(strText.Find(_T("\n<br_head>\n")), 0) : 0; // special tooltip with file icon const int iLineHeightOff = 1; const int iIconMinYBorder = bShowFileIcon ? 3 : 0; const int iIconWidth = bShowFileIcon ? theApp.GetBigSytemIconSize().cx : 0; const int iIconHeight = bShowFileIcon ? theApp.GetBigSytemIconSize().cy : 0; const int iIconDrawingWidth = bShowFileIcon ? (iIconWidth + 9) : 0; while (iPos != -1) { CString strLine = GetNextString(strText, _T('\n'), iPos); int iColon = bAutoFormatText ? strLine.Find(_T(':')) : -1; if (iColon != -1) { CSize siz; if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, m_bCol1Bold ? TTP_STANDARDTITLE : TTP_STANDARD, TTSS_NORMAL, strLine, iColon + 1, m_dwCol1DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { CFont* pOldFont = m_bCol1Bold ? pdc->SelectObject(&m_fontBold) : NULL; siz = pdc->GetTextExtent(strLine, iColon + 1); if (pOldFont) pdc->SelectObject(pOldFont); } iMaxCol1Width = max<int>(iMaxCol1Width, siz.cx + ((bShowFileIcon && iPos <= iCaptionEnd + strLine.GetLength()) ? iIconDrawingWidth : 0)); iTextHeight = siz.cy + iLineHeightOff; // update height with 'col1' string, because 'col2' string might be empty and therefore has no height if (iPos <= iCaptionEnd) iCaptionHeight += siz.cy + iLineHeightOff; else sizText.cy += siz.cy + iLineHeightOff; LPCTSTR pszCol2 = (LPCTSTR)strLine + iColon + 1; while (_istspace((_TUCHAR)*pszCol2)) pszCol2++; if (*pszCol2 != _T('\0')) { if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, TTP_STANDARD, TTSS_NORMAL, pszCol2, ((LPCTSTR)strLine + strLine.GetLength()) - pszCol2, m_dwCol2DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { siz = pdc->GetTextExtent(pszCol2, ((LPCTSTR)strLine + strLine.GetLength()) - pszCol2); } iMaxCol2Width = max<int>(iMaxCol2Width, siz.cx); } } else if (bShowFileIcon && iPos <= iCaptionEnd && iPos == strLine.GetLength() + 1){ // file name, printed bold on top without any tabbing or desc CSize siz; if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, m_bCol1Bold ? TTP_STANDARDTITLE : TTP_STANDARD, TTSS_NORMAL, strLine, strLine.GetLength(), m_dwCol1DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { CFont* pOldFont = m_bCol1Bold ? pdc->SelectObject(&m_fontBold) : NULL; siz = pdc->GetTextExtent(strLine); if (pOldFont) pdc->SelectObject(pOldFont); } iMaxSingleLineWidth = max<int>(iMaxSingleLineWidth, siz.cx + iIconDrawingWidth); iCaptionHeight += siz.cy + iLineHeightOff; } else if (!strLine.IsEmpty() && strLine.Compare(_T("<br>")) != 0 && strLine.Compare(_T("<br_head>")) != 0) { CSize siz; if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, TTP_STANDARD, TTSS_NORMAL, strLine, strLine.GetLength(), m_dwCol2DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { siz = pdc->GetTextExtent(strLine); } iMaxSingleLineWidth = max<int>(iMaxSingleLineWidth, siz.cx + ((bShowFileIcon && iPos <= iCaptionEnd) ? iIconDrawingWidth : 0)); if (bShowFileIcon && iPos <= iCaptionEnd + strLine.GetLength()) iCaptionHeight += siz.cy + iLineHeightOff; else sizText.cy += siz.cy + iLineHeightOff; } else{ CSize siz; if (hTheme && bUseEmbeddedThemeFonts) { CRect rcExtent; CRect rcBounding(0, 0, 32767, 32767); GetThemeTextExtent(hTheme, *pdc, TTP_STANDARD, TTSS_NORMAL, _T(" "), 1, m_dwCol2DrawTextFlags, &rcBounding, &rcExtent); siz.cx = rcExtent.Width(); siz.cy = rcExtent.Height(); } else { // TODO: Would need to use 'GetTabbedTextExtent' here, but do we actually use 'tabbed' text here at all ?? siz = pdc->GetTextExtent(_T(" "), 1); } sizText.cy += siz.cy + iLineHeightOff; } } if (bShowFileIcon && iCaptionEnd > 0) iCaptionHeight = max<int>(iCaptionHeight, theApp.GetBigSytemIconSize().cy + (2*iIconMinYBorder)); sizText.cy += iCaptionHeight; if (hTheme && theApp.m_ullComCtrlVer >= MAKEDLLVERULL(6,16,0,0)) sizText.cy += 2; // extra bottom margin for Vista/Theme iMaxCol1Width = min(m_iScreenWidth4, iMaxCol1Width); iMaxCol2Width = min(m_iScreenWidth4*2, iMaxCol2Width); const int iMiddleMargin = 6; iMaxSingleLineWidth = max(iMaxSingleLineWidth, iMaxCol1Width + iMiddleMargin + iMaxCol2Width); if (iMaxSingleLineWidth > m_iScreenWidth4*3) iMaxSingleLineWidth = m_iScreenWidth4*3; sizText.cx = iMaxSingleLineWidth; if (pNMCD->uDrawFlags & DT_CALCRECT) { pNMCD->nmcd.rc.left = rcWnd.left; pNMCD->nmcd.rc.top = rcWnd.top; pNMCD->nmcd.rc.right = rcWnd.left + sizText.cx; pNMCD->nmcd.rc.bottom = rcWnd.top + sizText.cy; } else { pwnd->ScreenToClient(&rcWnd); int iOldBkColor = -1; if (hTheme) { int iPartId = TTP_STANDARD; int iStateId = TTSS_NORMAL; if (IsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId)) DrawThemeParentBackground(m_hWnd, pdc->m_hDC, &rcWnd); DrawThemeBackground(hTheme, pdc->m_hDC, iPartId, iStateId, &rcWnd, NULL); } else { ::FillRect(*pdc, &rcWnd, GetSysColorBrush(COLOR_INFOBK)); iOldBkColor = pdc->SetBkColor(m_crTooltipBkColor); // Vista: Need to draw the window border explicitly !? if (theApp.m_ullComCtrlVer >= MAKEDLLVERULL(6,16,0,0)) { CPen pen; pen.CreatePen(0, 1, m_crTooltipTextColor); CPen *pOP = pdc->SelectObject(&pen); pdc->MoveTo(rcWnd.left, rcWnd.top); pdc->LineTo(rcWnd.right - 1, rcWnd.top); pdc->LineTo(rcWnd.right - 1, rcWnd.bottom - 1); pdc->LineTo(rcWnd.left, rcWnd.bottom - 1); pdc->LineTo(rcWnd.left, rcWnd.top); pdc->SelectObject(pOP); pen.DeleteObject(); } } int iOldBkMode = 0; if ((hTheme && !bUseEmbeddedThemeFonts) || (hTheme == NULL && iOldBkColor != -1)) iOldBkMode = pdc->SetBkMode(TRANSPARENT); CPoint ptText(pNMCD->nmcd.rc.left, pNMCD->nmcd.rc.top); iPos = 0; while (iPos != -1) { CString strLine = GetNextString(strText, _T('\n'), iPos); int iColon = bAutoFormatText ? strLine.Find(_T(':')) : -1; CRect rcDT; if (!bShowFileIcon || (unsigned)iPos > (unsigned)iCaptionEnd + strLine.GetLength()) rcDT.SetRect(ptText.x, ptText.y, ptText.x + iMaxCol1Width, ptText.y + iTextHeight); else rcDT.SetRect(ptText.x + iIconDrawingWidth, ptText.y, ptText.x + iMaxCol1Width, ptText.y + iTextHeight); if (iColon != -1) { // don't draw empty <col1> strings (they are still handy to use for skipping the <col1> space) if (iColon > 0) { if (hTheme && bUseEmbeddedThemeFonts) DrawThemeText(hTheme, pdc->m_hDC, m_bCol1Bold ? TTP_STANDARDTITLE : TTP_STANDARD, TTSS_NORMAL, strLine, iColon + 1, m_dwCol1DrawTextFlags, 0, &rcDT); else { CFont* pOldFont = m_bCol1Bold ? pdc->SelectObject(&m_fontBold) : NULL; pdc->DrawText(strLine, iColon + 1, &rcDT, m_dwCol1DrawTextFlags); if (pOldFont) pdc->SelectObject(pOldFont); } } LPCTSTR pszCol2 = (LPCTSTR)strLine + iColon + 1; while (_istspace((_TUCHAR)*pszCol2)) pszCol2++; if (*pszCol2 != _T('\0')) { rcDT.left = ptText.x + iMaxCol1Width + iMiddleMargin; rcDT.right = rcDT.left + iMaxCol2Width; if (hTheme && bUseEmbeddedThemeFonts) DrawThemeText(hTheme, pdc->m_hDC, TTP_STANDARD, TTSS_NORMAL, pszCol2, ((LPCTSTR)strLine + strLine.GetLength()) - pszCol2, m_dwCol2DrawTextFlags, 0, &rcDT); else pdc->DrawText(pszCol2, ((LPCTSTR)strLine + strLine.GetLength()) - pszCol2, &rcDT, m_dwCol2DrawTextFlags); } ptText.y += iTextHeight; } else if (bShowFileIcon && iPos <= iCaptionEnd && iPos == strLine.GetLength() + 1){ // first line on special fileicon tab - draw icon and bold filename if (hTheme && bUseEmbeddedThemeFonts) DrawThemeText(hTheme, pdc->m_hDC, m_bCol1Bold ? TTP_STANDARDTITLE : TTP_STANDARD, TTSS_NORMAL, strLine, strLine.GetLength(), m_dwCol1DrawTextFlags, 0, &CRect(ptText.x + iIconDrawingWidth, ptText.y, ptText.x + iMaxSingleLineWidth, ptText.y + iTextHeight)); else { CFont* pOldFont = m_bCol1Bold ? pdc->SelectObject(&m_fontBold) : NULL; pdc->DrawText(strLine, CRect(ptText.x + iIconDrawingWidth, ptText.y, ptText.x + iMaxSingleLineWidth, ptText.y + iTextHeight), m_dwCol1DrawTextFlags); if (pOldFont) pdc->SelectObject(pOldFont); } ptText.y += iTextHeight; int iImage = (int) theApp.GetFileTypeSystemImageIdx(strLine, -1, true); if (theApp.GetBigSystemImageList() != NULL) { int iPosY = rcDT.top; if (iCaptionHeight > iIconHeight) iPosY += (iCaptionHeight - iIconHeight) / 2; ::ImageList_Draw(theApp.GetBigSystemImageList(), iImage, pdc->GetSafeHdc(), ptText.x, iPosY, ILD_TRANSPARENT); } } else { bool bIsBrHeadLine = false; if (bAutoFormatText && (strLine.Compare(_T("<br>")) == 0 || (bIsBrHeadLine = strLine.Compare(_T("<br_head>")) == 0) == true)){ CPen pen; pen.CreatePen(0, 1, m_crTooltipTextColor); CPen *pOP = pdc->SelectObject(&pen); if (bIsBrHeadLine) ptText.y = iCaptionHeight; pdc->MoveTo(ptText.x, ptText.y + ((iTextHeight - 2) / 2)); pdc->LineTo(ptText.x + iMaxSingleLineWidth, ptText.y + ((iTextHeight - 2) / 2)); ptText.y += iTextHeight; pdc->SelectObject(pOP); pen.DeleteObject(); } else{ if (hTheme && bUseEmbeddedThemeFonts) { CRect rcLine(ptText.x, ptText.y, 32767, 32767); DrawThemeText(hTheme, pdc->m_hDC, TTP_STANDARD, TTSS_NORMAL, strLine, strLine.GetLength(), DT_EXPANDTABS | m_dwCol2DrawTextFlags, 0, &rcLine); ptText.y += iTextHeight; } else { // Text is written in the currently selected font. If 'nTabPositions' is 0 and 'lpnTabStopPositions' is NULL, // tabs are expanded to eight times the average character width. CSize siz; if (strLine.IsEmpty()) // Win98: To draw an empty line we need to output at least a space. siz = pdc->TabbedTextOut(ptText.x, ptText.y, _T(" "), 1, NULL, 0); else siz = pdc->TabbedTextOut(ptText.x, ptText.y, strLine, strLine.GetLength(), NULL, 0); ptText.y += siz.cy + iLineHeightOff; } } } } if (iOldBkColor != -1) pdc->SetBkColor(iOldBkColor); if (hTheme && !bUseEmbeddedThemeFonts) pdc->SetBkMode(iOldBkMode); } if (pOldDCFont) pdc->SelectObject(pOldDCFont); if (hTheme) CloseThemeData(hTheme); }