//------------------------------------------------------------------------ //! Overrides the custom draw handler, to allow custom coloring of cells //! with this column trait. //! //! @param owner The list control drawing //! @param pLVCD Pointer to NMLVCUSTOMDRAW structure //! @param pResult Modification to the drawing stage (CDRF_NEWFONT, etc.) //------------------------------------------------------------------------ void CGridColumnTraitText::OnCustomDraw(CGridListCtrlEx& owner, NMLVCUSTOMDRAW* pLVCD, LRESULT* pResult) { switch (pLVCD->nmcd.dwDrawStage) { // Before painting a cell case CDDS_ITEMPREPAINT | CDDS_SUBITEM: { m_OldTextColor = pLVCD->clrText; m_OldBackColor = pLVCD->clrTextBk; // Only change cell colors when not selected if (UpdateTextColor(pLVCD, pLVCD->clrText)) *pResult |= CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; if (UpdateBackColor(pLVCD, pLVCD->clrTextBk)) *pResult |= CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; if (owner.OnDisplayCellColor(pLVCD)) *pResult |= CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; // Changed the colors without asking for restoring the original color ASSERT((*pResult & CDRF_NOTIFYPOSTPAINT) || (pLVCD->clrText == m_OldTextColor && pLVCD->clrTextBk == m_OldBackColor)); LOGFONT newFont = { 0 }; bool createFont = owner.OnDisplayCellFont(pLVCD, newFont); createFont |= UpdateTextFont(pLVCD, newFont); if (createFont) { CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc); CFont* pNewFont = new CFont; VERIFY(pNewFont->CreateFontIndirect(&newFont)); m_pOldFont = pDC->SelectObject(pNewFont); *pResult |= CDRF_NOTIFYPOSTPAINT; // We need to restore the original font *pResult |= CDRF_NEWFONT; } } break; // After painting a cell case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM: { if (m_pOldFont != NULL) { // Restore the original font CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc); CFont* pNewFont = pDC->SelectObject(m_pOldFont); delete pNewFont; m_pOldFont = NULL; } pLVCD->clrText = m_OldTextColor; pLVCD->clrTextBk = m_OldBackColor; *pResult |= CDRF_NEWFONT; } break; } }
void CGridColumnTraitText::OnCustomDraw(CGridListCtrlEx& owner, NMLVCUSTOMDRAW* pLVCD, LRESULT* pResult) { int nRow = (int)pLVCD->nmcd.dwItemSpec; switch (pLVCD->nmcd.dwDrawStage) { // Before painting a cell case CDDS_ITEMPREPAINT | CDDS_SUBITEM: { // Remove the selection color for the focus cell, to make it easier to see focus int nCol = pLVCD->iSubItem; if (pLVCD->nmcd.uItemState & CDIS_SELECTED && owner.GetFocusCell()==nCol && owner.GetFocusRow()==nRow) { pLVCD->nmcd.uItemState &= ~CDIS_SELECTED; } if (!owner.IsRowSelected(nRow) && owner.GetHotItem()!=nRow) { if (UpdateTextColor(pLVCD->clrText)) *pResult |= CDRF_NEWFONT; if (UpdateBackColor(pLVCD->clrTextBk)) *pResult |= CDRF_NEWFONT; // Only change cell colors when not selected / in focus if (owner.OnDisplayCellColor(nRow, nCol, pLVCD->clrText, pLVCD->clrTextBk)) *pResult |= CDRF_NEWFONT; } LOGFONT newFont = {0}; if (owner.OnDisplayCellFont(nRow, nCol, newFont)) { CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc); CFont* pNewFont = new CFont; VERIFY( pNewFont->CreateFontIndirect(&newFont) ); m_pOldFont = pDC->SelectObject(pNewFont); *pResult |= CDRF_NOTIFYPOSTPAINT; // We need to restore the original font *pResult |= CDRF_NEWFONT; } } break; // After painting a cell case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM: { if (m_pOldFont!=NULL) { // Restore the original font CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc); CFont* pNewFont = pDC->SelectObject(m_pOldFont); delete pNewFont; } } break; } }
//------------------------------------------------------------------------ //! Overrides the custom draw handler, to allow custom coloring of cells //! with this column trait. //! //! @param owner The list control drawing //! @param pLVCD Pointer to NMLVCUSTOMDRAW structure //! @param pResult Modification to the drawing stage (CDRF_NEWFONT, etc.) //------------------------------------------------------------------------ void CGridColumnTraitText::OnCustomDraw(CGridListCtrlEx& owner, NMLVCUSTOMDRAW* pLVCD, LRESULT* pResult) { int nRow = (int)pLVCD->nmcd.dwItemSpec; switch (pLVCD->nmcd.dwDrawStage) { // Before painting a cell case CDDS_ITEMPREPAINT | CDDS_SUBITEM: { int nCol = pLVCD->iSubItem; m_OldTextColor = pLVCD->clrText; m_OldBackColor = pLVCD->clrTextBk; // Only change cell colors when not selected if (UpdateTextColor(pLVCD->clrText)) *pResult |= CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; if (UpdateBackColor(pLVCD->clrTextBk)) *pResult |= CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; if (owner.OnDisplayCellColor(nRow, nCol, pLVCD->clrText, pLVCD->clrTextBk)) *pResult |= CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; LOGFONT newFont = {0}; if (owner.OnDisplayCellFont(nRow, nCol, newFont)) { CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc); CFont* pNewFont = new CFont; VERIFY( pNewFont->CreateFontIndirect(&newFont) ); m_pOldFont = pDC->SelectObject(pNewFont); *pResult |= CDRF_NOTIFYPOSTPAINT; // We need to restore the original font *pResult |= CDRF_NEWFONT; } } break; // After painting a cell case CDDS_ITEMPOSTPAINT | CDDS_SUBITEM: { if (m_pOldFont!=NULL) { // Restore the original font CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc); CFont* pNewFont = pDC->SelectObject(m_pOldFont); delete pNewFont; } pLVCD->clrText = m_OldTextColor; pLVCD->clrTextBk = m_OldBackColor; *pResult |= CDRF_NEWFONT; } break; } }