From 863f21995955fb3e9aa471430218967d4e642c27 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期四, 29 五月 2025 16:11:24 +0800
Subject: [PATCH] Merge branch 'liuyang'

---
 SourceCode/Bond/Servo/GridControl/GridCellBase.cpp |  773 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 773 insertions(+), 0 deletions(-)

diff --git a/SourceCode/Bond/Servo/GridControl/GridCellBase.cpp b/SourceCode/Bond/Servo/GridControl/GridCellBase.cpp
new file mode 100644
index 0000000..4b426fd
--- /dev/null
+++ b/SourceCode/Bond/Servo/GridControl/GridCellBase.cpp
@@ -0,0 +1,773 @@
+// GridCellBase.cpp : implementation file
+//
+// MFC Grid Control - Main grid cell base class
+//
+// Provides the implementation for the base cell type of the
+// grid control. No data is stored (except for state) but default
+// implementations of drawing, printingetc provided. MUST be derived
+// from to be used.
+//
+// Written by Chris Maunder <chris@codeproject.com>
+// Copyright (c) 1998-2005. All Rights Reserved.
+//
+// This code may be used in compiled form in any way you desire. This
+// file may be redistributed unmodified by any means PROVIDING it is 
+// not sold for profit without the authors written consent, and 
+// providing that this notice and the authors name and all copyright 
+// notices remains intact. 
+//
+// An email letting me know how you are using it would be nice as well. 
+//
+// This file is provided "as is" with no expressed or implied warranty.
+// The author accepts no liability for any damage/loss of business that
+// this product may cause.
+//
+// For use with CGridCtrl v2.22+
+//
+// History:
+// Ken Bertelson - 12 Apr 2000 - Split CGridCell into CGridCell and CGridCellBase
+// C Maunder     - 19 May 2000 - Fixed sort arrow drawing (Ivan Ilinov)
+// C Maunder     - 29 Aug 2000 - operator= checks for NULL font before setting (Martin Richter)
+// C Maunder     - 15 Oct 2000 - GetTextExtent fixed (Martin Richter)
+// C Maunder     -  1 Jan 2001 - Added ValidateEdit
+// Yogurt        - 13 Mar 2004 - GetCellExtent fixed
+//
+// NOTES: Each grid cell should take care of it's own drawing, though the Draw()
+//        method takes an "erase background" paramter that is called if the grid
+//        decides to draw the entire grid background in on hit. Certain ambient
+//        properties such as the default font to use, and hints on how to draw
+//        fixed cells should be fetched from the parent grid. The grid trusts the
+//        cells will behave in a certain way, and the cells trust the grid will
+//        supply accurate information.
+//        
+/////////////////////////////////////////////////////////////////////////////
+
+#include "stdafx.h"
+#include "GridCtrl.h"
+#include "GridCellBase.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static const char* THIS_FILE = __FILE__;
+#endif
+
+IMPLEMENT_DYNAMIC(CGridCellBase, CObject)
+
+/////////////////////////////////////////////////////////////////////////////
+// GridCellBase
+
+CGridCellBase::CGridCellBase()
+{
+    Reset();
+}
+
+CGridCellBase::~CGridCellBase()
+{
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// GridCellBase Operations
+
+void CGridCellBase::Reset()
+{
+    m_nState  = 0;
+}
+
+void CGridCellBase::operator=(const CGridCellBase& cell)
+{
+	if (this == &cell) return;
+
+    SetGrid(cell.GetGrid());    // do first in case of dependencies
+
+    SetText(cell.GetText());
+    SetImage(cell.GetImage());
+    SetData(cell.GetData());
+    SetState(cell.GetState());
+    SetFormat(cell.GetFormat());
+    SetTextClr(cell.GetTextClr());
+    SetBackClr(cell.GetBackClr());
+    SetFont(cell.IsDefaultFont()? NULL : cell.GetFont());
+    SetMargin(cell.GetMargin());
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// CGridCellBase Attributes
+
+// Returns a pointer to a cell that holds default values for this particular type of cell
+CGridCellBase* CGridCellBase::GetDefaultCell() const
+{
+    if (GetGrid())
+        return GetGrid()->GetDefaultCell(IsFixedRow(), IsFixedCol());
+    return NULL;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+// CGridCellBase Operations
+
+// EFW - Various changes to make it draw cells better when using alternate
+// color schemes.  Also removed printing references as that's now done
+// by PrintCell() and fixed the sort marker so that it doesn't draw out
+// of bounds.
+BOOL CGridCellBase::Draw(CDC* pDC, int nRow, int nCol, CRect rect,  BOOL bEraseBkgnd /*=TRUE*/)
+{
+    // Note - all through this function we totally brutalise 'rect'. Do not
+    // depend on it's value being that which was passed in.
+
+    CGridCtrl* pGrid = GetGrid();
+//    ASSERT(pGrid);
+
+    if (!pGrid || !pDC)
+        return FALSE;
+
+    if( rect.Width() <= 0 || rect.Height() <= 0)  // prevents imagelist item from drawing even
+        return FALSE;                             //  though cell is hidden
+
+    //TRACE3("Drawing %scell %d, %d\n", IsFixed()? _T("Fixed ") : _T(""), nRow, nCol);
+
+    int nSavedDC = pDC->SaveDC();
+    pDC->SetBkMode(TRANSPARENT);
+
+    // Get the default cell implementation for this kind of cell. We use it if this cell
+    // has anything marked as "default"
+    CGridDefaultCell *pDefaultCell = (CGridDefaultCell*) GetDefaultCell();
+    if (!pDefaultCell)
+        return FALSE;
+
+    // Set up text and background colours
+    COLORREF TextClr, TextBkClr;
+
+    TextClr = (GetTextClr() == CLR_DEFAULT)? pDefaultCell->GetTextClr() : GetTextClr();
+    if (GetBackClr() == CLR_DEFAULT)
+        TextBkClr = pDefaultCell->GetBackClr();
+    else
+    {
+        bEraseBkgnd = TRUE;
+        TextBkClr = GetBackClr();
+    }
+
+    // Draw cell background and highlighting (if necessary)
+    if ( IsFocused() || IsDropHighlighted() )
+    {
+        // Always draw even in list mode so that we can tell where the
+        // cursor is at.  Use the highlight colors though.
+        if(GetState() & GVIS_SELECTED)
+        {
+            TextBkClr = ::GetSysColor(COLOR_HIGHLIGHT);
+            TextClr = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
+            bEraseBkgnd = TRUE;
+        }
+
+        rect.right++; rect.bottom++;    // FillRect doesn't draw RHS or bottom
+        if (bEraseBkgnd)
+        {
+            TRY 
+            {
+                CBrush brush(TextBkClr);
+                pDC->FillRect(rect, &brush);
+            } 
+            CATCH(CResourceException, e)
+            {
+                //e->ReportError();
+            }
+            END_CATCH
+        }
+
+        // Don't adjust frame rect if no grid lines so that the
+        // whole cell is enclosed.
+        if(pGrid->GetGridLines() != GVL_NONE)
+        {
+            rect.right--;
+            rect.bottom--;
+        }
+
+        if (pGrid->GetFrameFocusCell())
+        {
+                // Use same color as text to outline the cell so that it shows
+                // up if the background is black.
+            TRY 
+            {
+                CBrush brush(TextClr);
+                pDC->FrameRect(rect, &brush);
+            }
+            CATCH(CResourceException, e)
+            {
+                //e->ReportError();
+            }
+            END_CATCH
+        }
+        pDC->SetTextColor(TextClr);
+
+        // Adjust rect after frame draw if no grid lines
+        if(pGrid->GetGridLines() == GVL_NONE)
+        {
+            rect.right--;
+            rect.bottom--;
+        }
+
+		//rect.DeflateRect(0,1,1,1);  - Removed by Yogurt
+    }
+    else if ((GetState() & GVIS_SELECTED))
+    {
+        rect.right++; rect.bottom++;    // FillRect doesn't draw RHS or bottom
+        pDC->FillSolidRect(rect, ::GetSysColor(COLOR_HIGHLIGHT));
+        rect.right--; rect.bottom--;
+        pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
+    }
+    else
+    {
+        if (bEraseBkgnd)
+        {
+            rect.right++; rect.bottom++;    // FillRect doesn't draw RHS or bottom
+            CBrush brush(TextBkClr);
+            pDC->FillRect(rect, &brush);
+            rect.right--; rect.bottom--;
+        }
+        pDC->SetTextColor(TextClr);
+    }
+
+    // Draw lines only when wanted
+    if (IsFixed() && pGrid->GetGridLines() != GVL_NONE)
+    {
+        CCellID FocusCell = pGrid->GetFocusCell();
+
+        // As above, always show current location even in list mode so
+        // that we know where the cursor is at.
+        BOOL bHiliteFixed = pGrid->GetTrackFocusCell() && pGrid->IsValid(FocusCell) &&
+                            (FocusCell.row == nRow || FocusCell.col == nCol);
+
+        // If this fixed cell is on the same row/col as the focus cell,
+        // highlight it.
+        if (bHiliteFixed)
+        {
+            rect.right++; rect.bottom++;
+            pDC->DrawEdge(rect, BDR_SUNKENINNER /*EDGE_RAISED*/, BF_RECT);
+            rect.DeflateRect(1,1);
+        }
+        else
+        {
+            CPen lightpen(PS_SOLID, 1,  ::GetSysColor(COLOR_3DHIGHLIGHT)),
+                darkpen(PS_SOLID,  1, ::GetSysColor(COLOR_3DDKSHADOW)),
+                *pOldPen = pDC->GetCurrentPen();
+
+            pDC->SelectObject(&lightpen);
+            pDC->MoveTo(rect.right, rect.top);
+            pDC->LineTo(rect.left, rect.top);
+            pDC->LineTo(rect.left, rect.bottom);
+
+            pDC->SelectObject(&darkpen);
+            pDC->MoveTo(rect.right, rect.top);
+            pDC->LineTo(rect.right, rect.bottom);
+            pDC->LineTo(rect.left, rect.bottom);
+
+            pDC->SelectObject(pOldPen);
+            rect.DeflateRect(1,1);
+        }
+    }
+
+    // Draw Text and image
+#if !defined(_WIN32_WCE_NO_PRINTING) && !defined(GRIDCONTROL_NO_PRINTING)
+    if (!pDC->m_bPrinting)
+#endif
+    {
+        CFont *pFont = GetFontObject();
+//		ASSERT(pFont);
+        if (pFont)
+            pDC->SelectObject(pFont);
+    }
+
+    //rect.DeflateRect(GetMargin(), 0); - changed by Yogurt
+    rect.DeflateRect(GetMargin(), GetMargin());    
+    rect.right++;    
+    rect.bottom++;
+
+    if (pGrid->GetImageList() && GetImage() >= 0)
+    {
+        IMAGEINFO Info;
+        if (pGrid->GetImageList()->GetImageInfo(GetImage(), &Info))
+        {
+            //  would like to use a clipping region but seems to have issue
+            //  working with CMemDC directly.  Instead, don't display image
+            //  if any part of it cut-off
+            //
+            // CRgn rgn;
+            // rgn.CreateRectRgnIndirect(rect);
+            // pDC->SelectClipRgn(&rgn);
+            // rgn.DeleteObject();
+
+            /*
+            // removed by Yogurt
+            int nImageWidth = Info.rcImage.right-Info.rcImage.left+1;
+            int nImageHeight = Info.rcImage.bottom-Info.rcImage.top+1;
+            if( nImageWidth + rect.left <= rect.right + (int)(2*GetMargin())
+                && nImageHeight + rect.top <= rect.bottom + (int)(2*GetMargin())  )
+            {
+                pGrid->GetImageList()->Draw(pDC, GetImage(), rect.TopLeft(), ILD_NORMAL);
+            }
+            */
+            // Added by Yogurt
+            int nImageWidth = Info.rcImage.right-Info.rcImage.left;            
+            int nImageHeight = Info.rcImage.bottom-Info.rcImage.top;            
+            if ((nImageWidth + rect.left <= rect.right) && (nImageHeight + rect.top <= rect.bottom))                
+                pGrid->GetImageList()->Draw(pDC, GetImage(), rect.TopLeft(), ILD_NORMAL);
+
+            //rect.left += nImageWidth+GetMargin();
+        }
+    }
+
+    // Draw sort arrow
+    if (pGrid->GetSortColumn() == nCol && nRow == 0)
+    {
+        CSize size = pDC->GetTextExtent(_T("M"));
+        int nOffset = 2;
+
+        // Base the size of the triangle on the smaller of the column
+        // height or text height with a slight offset top and bottom.
+        // Otherwise, it can get drawn outside the bounds of the cell.
+        size.cy -= (nOffset * 2);
+
+        if (size.cy >= rect.Height())
+            size.cy = rect.Height() - (nOffset * 2);
+
+        size.cx = size.cy;      // Make the dimensions square
+
+        // Kludge for vertical text
+        BOOL bVertical = (GetFont()->lfEscapement == 900);
+
+        // Only draw if it'll fit!
+        //if (size.cx + rect.left < rect.right + (int)(2*GetMargin())) - changed / Yogurt
+        if (size.cx + rect.left < rect.right)
+        {
+            int nTriangleBase = rect.bottom - nOffset - size.cy;    // Triangle bottom right
+            //int nTriangleBase = (rect.top + rect.bottom - size.cy)/2; // Triangle middle right
+            //int nTriangleBase = rect.top + nOffset;                 // Triangle top right
+
+            //int nTriangleLeft = rect.right - size.cx;                 // Triangle RHS
+            //int nTriangleLeft = (rect.right + rect.left - size.cx)/2; // Triangle middle
+            //int nTriangleLeft = rect.left;                            // Triangle LHS
+
+            int nTriangleLeft;
+            if (bVertical)
+                nTriangleLeft = (rect.right + rect.left - size.cx)/2; // Triangle middle
+            else
+                nTriangleLeft = rect.right - size.cx;               // Triangle RHS
+
+            CPen penShadow(PS_SOLID, 0, ::GetSysColor(COLOR_3DSHADOW));
+            CPen penLight(PS_SOLID, 0, ::GetSysColor(COLOR_3DHILIGHT));
+            if (pGrid->GetSortAscending())
+            {
+                // Draw triangle pointing upwards
+                CPen *pOldPen = (CPen*) pDC->SelectObject(&penLight);
+                pDC->MoveTo( nTriangleLeft + 1, nTriangleBase + size.cy + 1);
+                pDC->LineTo( nTriangleLeft + (size.cx / 2) + 1, nTriangleBase + 1 );
+                pDC->LineTo( nTriangleLeft + size.cx + 1, nTriangleBase + size.cy + 1);
+                pDC->LineTo( nTriangleLeft + 1, nTriangleBase + size.cy + 1);
+
+                pDC->SelectObject(&penShadow);
+                pDC->MoveTo( nTriangleLeft, nTriangleBase + size.cy );
+                pDC->LineTo( nTriangleLeft + (size.cx / 2), nTriangleBase );
+                pDC->LineTo( nTriangleLeft + size.cx, nTriangleBase + size.cy );
+                pDC->LineTo( nTriangleLeft, nTriangleBase + size.cy );
+                pDC->SelectObject(pOldPen);
+            }
+            else
+            {
+                // Draw triangle pointing downwards
+                CPen *pOldPen = (CPen*) pDC->SelectObject(&penLight);
+                pDC->MoveTo( nTriangleLeft + 1, nTriangleBase + 1 );
+                pDC->LineTo( nTriangleLeft + (size.cx / 2) + 1, nTriangleBase + size.cy + 1 );
+                pDC->LineTo( nTriangleLeft + size.cx + 1, nTriangleBase + 1 );
+                pDC->LineTo( nTriangleLeft + 1, nTriangleBase + 1 );
+    
+                pDC->SelectObject(&penShadow);
+                pDC->MoveTo( nTriangleLeft, nTriangleBase );
+                pDC->LineTo( nTriangleLeft + (size.cx / 2), nTriangleBase + size.cy );
+                pDC->LineTo( nTriangleLeft + size.cx, nTriangleBase );
+                pDC->LineTo( nTriangleLeft, nTriangleBase );
+                pDC->SelectObject(pOldPen);
+            }
+            
+            if (!bVertical)
+                rect.right -= size.cy;
+        }
+    }
+
+    // We want to see '&' characters so use DT_NOPREFIX
+    GetTextRect(rect);
+    rect.right++;    
+    rect.bottom++;
+
+    DrawText(pDC->m_hDC, GetText(), -1, rect, GetFormat() | DT_NOPREFIX);
+
+    pDC->RestoreDC(nSavedDC);
+
+    return TRUE;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// CGridCellBase Mouse and Cursor events
+
+// Not yet implemented
+void CGridCellBase::OnMouseEnter()
+{
+//    TRACE0("Mouse entered cell\n");
+}
+
+void CGridCellBase::OnMouseOver()
+{
+    //TRACE0("Mouse over cell\n");
+}
+
+// Not Yet Implemented
+void CGridCellBase::OnMouseLeave()
+{
+//    TRACE0("Mouse left cell\n");
+}
+
+void CGridCellBase::OnClick( CPoint PointCellRelative)
+{
+    UNUSED_ALWAYS(PointCellRelative);
+//    TRACE2("Mouse Left btn up in cell at x=%i y=%i\n", PointCellRelative.x, PointCellRelative.y);
+}
+
+void CGridCellBase::OnClickDown( CPoint PointCellRelative)
+{
+    UNUSED_ALWAYS(PointCellRelative);
+ //   TRACE2("Mouse Left btn down in cell at x=%i y=%i\n", PointCellRelative.x, PointCellRelative.y);
+}
+
+void CGridCellBase::OnRClick( CPoint PointCellRelative)
+{
+    UNUSED_ALWAYS(PointCellRelative);
+ //   TRACE2("Mouse right-clicked in cell at x=%i y=%i\n", PointCellRelative.x, PointCellRelative.y);
+}
+
+void CGridCellBase::OnDblClick( CPoint PointCellRelative)
+{
+    UNUSED_ALWAYS(PointCellRelative);
+//    TRACE2("Mouse double-clicked in cell at x=%i y=%i\n", PointCellRelative.x, PointCellRelative.y);
+}
+
+// Return TRUE if you set the cursor
+BOOL CGridCellBase::OnSetCursor()
+{
+#ifndef _WIN32_WCE_NO_CURSOR
+    SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
+#endif
+    return TRUE;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// CGridCellBase editing
+
+void CGridCellBase::OnEndEdit() 
+{
+//	ASSERT( FALSE); 
+}
+
+BOOL CGridCellBase::ValidateEdit(LPCTSTR str)
+{
+    UNUSED_ALWAYS(str);
+	return TRUE;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// CGridCellBase Sizing
+
+BOOL CGridCellBase::GetTextRect( LPRECT pRect)  // i/o:  i=dims of cell rect; o=dims of text rect
+{
+    if (GetImage() >= 0)
+    {
+        IMAGEINFO Info;
+
+        CGridCtrl* pGrid = GetGrid();
+        CImageList* pImageList = pGrid->GetImageList();
+        
+        if (pImageList && pImageList->GetImageInfo( GetImage(), &Info))
+        {
+            int nImageWidth = Info.rcImage.right-Info.rcImage.left+1;
+            pRect->left += nImageWidth + GetMargin();
+        }
+    }
+
+    return TRUE;
+}
+
+// By default this uses the selected font (which is a bigger font)
+CSize CGridCellBase::GetTextExtent(LPCTSTR szText, CDC* pDC /*= NULL*/)
+{
+    CGridCtrl* pGrid = GetGrid();
+//    ASSERT(pGrid);
+
+    BOOL bReleaseDC = FALSE;
+    if (pDC == NULL || szText == NULL)
+    {
+        if (szText)
+			pDC = pGrid->GetDC();
+        if (pDC == NULL || szText == NULL) 
+        {
+            CGridDefaultCell* pDefCell = (CGridDefaultCell*) GetDefaultCell();
+//            ASSERT(pDefCell);
+            return CSize(pDefCell->GetWidth(), pDefCell->GetHeight());
+        }
+        bReleaseDC = TRUE;
+    }
+
+    CFont *pOldFont = NULL,
+          *pFont = GetFontObject();
+    if (pFont)
+        pOldFont = pDC->SelectObject(pFont);
+
+    CSize size;
+    int nFormat = GetFormat();
+
+    // If the cell is a multiline cell, then use the width of the cell
+    // to get the height
+    if ((nFormat & DT_WORDBREAK) && !(nFormat & DT_SINGLELINE))
+    {
+        CString str = szText;
+        int nMaxWidth = 0;
+        while (TRUE)
+        {
+            int nPos = str.Find(_T('\n'));
+            CString TempStr = (nPos < 0)? str : str.Left(nPos);
+            int nTempWidth = pDC->GetTextExtent(TempStr).cx;
+            if (nTempWidth > nMaxWidth)
+                nMaxWidth = nTempWidth;
+
+            if (nPos < 0)
+                break;
+            str = str.Mid(nPos + 1);    // Bug fix by Thomas Steinborn
+        }
+        
+        CRect rect;
+        rect.SetRect(0,0, nMaxWidth+1, 0);
+        pDC->DrawText(szText, -1, rect, nFormat | DT_CALCRECT);
+        size = rect.Size();
+    }
+    else
+        size = pDC->GetTextExtent(szText, (int)_tcslen(szText));
+
+    // Removed by Yogurt
+    //TEXTMETRIC tm;
+    //pDC->GetTextMetrics(&tm);
+    //size.cx += (tm.tmOverhang);
+
+    if (pOldFont)
+        pDC->SelectObject(pOldFont);
+    
+    size += CSize(2*GetMargin(), 2*GetMargin());
+
+    // Kludge for vertical text
+    LOGFONT *pLF = GetFont();
+    if (pLF->lfEscapement == 900 || pLF->lfEscapement == -900)
+    {
+        int nTemp = size.cx;
+        size.cx = size.cy;
+        size.cy = nTemp;
+        size += CSize(0, 4*GetMargin());
+    }
+    
+    if (bReleaseDC)
+        pGrid->ReleaseDC(pDC);
+
+    return size;
+}
+
+
+CSize CGridCellBase::GetCellExtent(CDC* pDC)
+{    
+    CSize size = GetTextExtent(GetText(), pDC);    
+    CSize ImageSize(0,0);    
+    
+    int nImage = GetImage();    
+    if (nImage >= 0)    
+    {        
+        CGridCtrl* pGrid = GetGrid();        
+//        ASSERT(pGrid);        
+        IMAGEINFO Info;        
+        if (pGrid->GetImageList() && pGrid->GetImageList()->GetImageInfo(nImage, &Info))         
+        {            
+            ImageSize = CSize(Info.rcImage.right-Info.rcImage.left,                                 
+                Info.rcImage.bottom-Info.rcImage.top);            
+            if (size.cx > 2*(int)GetMargin ())                
+                ImageSize.cx += GetMargin();            
+            ImageSize.cy += 2*(int)GetMargin ();        
+        }    
+    }    
+    size.cx += ImageSize.cx + 1;    
+    size.cy = max(size.cy, ImageSize.cy) + 1;    
+    if (IsFixed())    
+    {        
+        size.cx++;        
+        size.cy++;    
+    }    
+    return size;
+}
+
+// EFW - Added to print cells so that grids that use different colors are
+// printed correctly.
+BOOL CGridCellBase::PrintCell(CDC* pDC, int /*nRow*/, int /*nCol*/, CRect rect)
+{
+#if defined(_WIN32_WCE_NO_PRINTING) || defined(GRIDCONTROL_NO_PRINTING)
+    return FALSE;
+#else
+    COLORREF crFG, crBG;
+    GV_ITEM Item;
+
+    CGridCtrl* pGrid = GetGrid();
+    if (!pGrid || !pDC)
+        return FALSE;
+
+    if( rect.Width() <= 0
+        || rect.Height() <= 0)  // prevents imagelist item from drawing even
+        return FALSE;           //  though cell is hidden
+
+    int nSavedDC = pDC->SaveDC();
+
+    pDC->SetBkMode(TRANSPARENT);
+
+    if (pGrid->GetShadedPrintOut())
+    {
+        // Get the default cell implementation for this kind of cell. We use it if this cell
+        // has anything marked as "default"
+        CGridDefaultCell *pDefaultCell = (CGridDefaultCell*) GetDefaultCell();
+        if (!pDefaultCell)
+            return FALSE;
+
+        // Use custom color if it doesn't match the default color and the
+        // default grid background color.  If not, leave it alone.
+        if(IsFixed())
+            crBG = (GetBackClr() != CLR_DEFAULT) ? GetBackClr() : pDefaultCell->GetBackClr();
+        else
+            crBG = (GetBackClr() != CLR_DEFAULT && GetBackClr() != pDefaultCell->GetBackClr()) ?
+                GetBackClr() : CLR_DEFAULT;
+
+        // Use custom color if the background is different or if it doesn't
+        // match the default color and the default grid text color.  
+        if(IsFixed())
+            crFG = (GetBackClr() != CLR_DEFAULT) ? GetTextClr() : pDefaultCell->GetTextClr();
+        else
+            crFG = (GetBackClr() != CLR_DEFAULT) ? GetTextClr() : pDefaultCell->GetTextClr();
+
+        // If not printing on a color printer, adjust the foreground color
+        // to a gray scale if the background color isn't used so that all
+        // colors will be visible.  If not, some colors turn to solid black
+        // or white when printed and may not show up.  This may be caused by
+        // coarse dithering by the printer driver too (see image note below).
+        if(pDC->GetDeviceCaps(NUMCOLORS) == 2 && crBG == CLR_DEFAULT)
+            crFG = RGB(GetRValue(crFG) * 0.30, GetGValue(crFG) * 0.59,
+                GetBValue(crFG) * 0.11);
+
+        // Only erase the background if the color is not the default
+        // grid background color.
+        if(crBG != CLR_DEFAULT)
+        {
+            CBrush brush(crBG);
+            rect.right++; rect.bottom++;
+            pDC->FillRect(rect, &brush);
+            rect.right--; rect.bottom--;
+        }
+    }
+    else
+    {
+        crBG = CLR_DEFAULT;
+        crFG = RGB(0, 0, 0);
+    }
+
+    pDC->SetTextColor(crFG);
+
+    CFont *pFont = GetFontObject();
+    if (pFont)
+        pDC->SelectObject(pFont);
+
+    /*
+    // ***************************************************
+    // Disabled - if you need this functionality then you'll need to rewrite.
+    // Create the appropriate font and select into DC.
+    CFont Font;
+    // Bold the fixed cells if not shading the print out.  Use italic
+    // font it it is enabled.
+    const LOGFONT* plfFont = GetFont();
+    if(IsFixed() && !pGrid->GetShadedPrintOut())
+    {
+        Font.CreateFont(plfFont->lfHeight, 0, 0, 0, FW_BOLD, plfFont->lfItalic, 0, 0,
+            ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
+#ifndef _WIN32_WCE
+            PROOF_QUALITY,
+#else
+            DEFAULT_QUALITY,
+#endif
+            VARIABLE_PITCH | FF_SWISS, plfFont->lfFaceName);
+    }
+    else
+        Font.CreateFontIndirect(plfFont);
+
+    pDC->SelectObject(&Font);
+    // ***************************************************
+    */
+
+    // Draw lines only when wanted on fixed cells.  Normal cell grid lines
+    // are handled in OnPrint.
+    if(pGrid->GetGridLines() != GVL_NONE && IsFixed())
+    {
+        CPen lightpen(PS_SOLID, 1,  ::GetSysColor(COLOR_3DHIGHLIGHT)),
+             darkpen(PS_SOLID,  1, ::GetSysColor(COLOR_3DDKSHADOW)),
+            *pOldPen = pDC->GetCurrentPen();
+
+        pDC->SelectObject(&lightpen);
+        pDC->MoveTo(rect.right, rect.top);
+        pDC->LineTo(rect.left, rect.top);
+        pDC->LineTo(rect.left, rect.bottom);
+
+        pDC->SelectObject(&darkpen);
+        pDC->MoveTo(rect.right, rect.top);
+        pDC->LineTo(rect.right, rect.bottom);
+        pDC->LineTo(rect.left, rect.bottom);
+
+        rect.DeflateRect(1,1);
+        pDC->SelectObject(pOldPen);
+    }
+
+    rect.DeflateRect(GetMargin(), 0);
+
+    if(pGrid->GetImageList() && GetImage() >= 0)
+    {
+        // NOTE: If your printed images look like fuzzy garbage, check the
+        //       settings on your printer driver.  If it's using coarse
+        //       dithering and/or vector graphics, they may print wrong.
+        //       Changing to fine dithering and raster graphics makes them
+        //       print properly.  My HP 4L had that problem.
+
+        IMAGEINFO Info;
+        if(pGrid->GetImageList()->GetImageInfo(GetImage(), &Info))
+        {
+            int nImageWidth = Info.rcImage.right-Info.rcImage.left;
+            pGrid->GetImageList()->Draw(pDC, GetImage(), rect.TopLeft(), ILD_NORMAL);
+            rect.left += nImageWidth+GetMargin();
+        }
+    }
+
+    // Draw without clipping so as not to lose text when printed for real
+	// DT_NOCLIP removed 01.01.01. Slower, but who cares - we are printing!
+    DrawText(pDC->m_hDC, GetText(), -1, rect,
+        GetFormat() | /*DT_NOCLIP | */ DT_NOPREFIX);
+
+    pDC->RestoreDC(nSavedDC);
+
+    return TRUE;
+#endif
+}
+
+/*****************************************************************************
+Callable by derived classes, only
+*****************************************************************************/
+LRESULT CGridCellBase::SendMessageToParent(int nRow, int nCol, int nMessage)
+{
+    CGridCtrl* pGrid = GetGrid();
+    if( pGrid)
+        return pGrid->SendMessageToParent(nRow, nCol, nMessage);
+    else
+        return 0;
+}
\ No newline at end of file

--
Gitblit v1.9.3