GridCellBase.cpp
上传用户:wenjimin
上传日期:2014-08-12
资源大小:111k
文件大小:7k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. // GridCellBase.cpp: implementation of the CGridCellBase class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GridCtrl.h"
  6. #include "GridCellBase.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. IMPLEMENT_DYNAMIC(CGridCellBase, CObject)
  16. CGridCellBase::CGridCellBase()
  17. {
  18. m_nState=0;//如果不对它初始化,非固定的单元格背景色会不对
  19. }
  20. CGridCellBase::~CGridCellBase()
  21. {
  22. }
  23. BOOL CGridCellBase::Draw(CDC* pDC,int nRow,int nCol,CRect rect,BOOL bEraseBkgng/*=TRUE*/)
  24. {
  25.     CGridCtrl* pGrid = GetGrid();
  26.     ASSERT(pGrid);
  27.     if (!pGrid ||!pDC)
  28.         return FALSE;
  29.     if( rect.Width() <= 0 || rect.Height() <= 0)  // prevents imagelist item from drawing even
  30.         return FALSE;                             //  though cell is hidden
  31.     TRACE3("Drawing %scell %d, %dn", IsFixed()? _T("Fixed ") : _T(""), nRow, nCol);
  32.     int nSavedDC = pDC->SaveDC();
  33.     pDC->SetBkMode(TRANSPARENT);//背景透明模式
  34. CGridDefaultCell *pDefaultCell = (CGridDefaultCell*) GetDefaultCell();//得到却省得单元格设置
  35.     if (!pDefaultCell)
  36.         return FALSE;
  37. // Set up text and background colours
  38.     COLORREF TextClr, TextBkClr;//文本色和文本背景色
  39. TextClr = (GetTextClr() == CLR_DEFAULT)? pDefaultCell->GetTextClr() : GetTextClr();//取得颜色
  40.     if (GetBackClr() == CLR_DEFAULT)//CLR_DEFAULT是Windows却省的背景颜色
  41.         TextBkClr = pDefaultCell->GetBackClr();
  42.     else
  43.     {
  44.        TextBkClr = GetBackClr();
  45.     }
  46. if(!IsFixed())
  47. {
  48. TRY
  49. {
  50. CBrush brush(TextBkClr);
  51. pDC->FillRect(rect, &brush);//填充矩形
  52.         CATCH(CResourceException, e)
  53. {
  54. e->ReportError();
  55. }
  56. END_CATCH
  57. }
  58. else
  59. {
  60. CPen lightpen(PS_SOLID, 1,  ::GetSysColor(COLOR_3DHIGHLIGHT)),
  61.                 darkpen(PS_SOLID,  1, ::GetSysColor(COLOR_3DDKSHADOW)),
  62.                 *pOldPen = pDC->GetCurrentPen();
  63. pDC->SelectObject(&lightpen);//使用亮色
  64.         pDC->MoveTo(rect.right, rect.top);
  65.         pDC->LineTo(rect.left, rect.top);//从右到左画顶边
  66.         pDC->LineTo(rect.left, rect.bottom);//从上到下画左边
  67. pDC->SelectObject(&darkpen);//使用暗色
  68.         pDC->MoveTo(rect.right, rect.top);
  69.         pDC->LineTo(rect.right, rect.bottom);//从上到下画右边
  70.         pDC->LineTo(rect.left, rect.bottom);//从右到左画底边
  71. pDC->SelectObject(pOldPen);//恢复笔
  72. }
  73. CFont *pFont = GetFontObject();//在这里选择了字体
  74. ASSERT(pFont);
  75.     if(pFont)
  76. pDC->SelectObject(pFont);
  77. // Draw sort arrow
  78. //画排序箭头:
  79.     if (pGrid->GetSortColumn() == nCol && nRow == 0)//如果排序的列是nCol并且行号是0才画
  80.     {
  81.         CSize size = pDC->GetTextExtent(_T("M"));
  82.         int nOffset = 2;
  83.         // Base the size of the triangle on the smaller of the column
  84.         // height or text height with a slight offset top and bottom.
  85.         // Otherwise, it can get drawn outside the bounds of the cell.
  86.         size.cy -= (nOffset * 2);
  87.         if (size.cy >= rect.Height())
  88.             size.cy = rect.Height() - (nOffset * 2);
  89.         size.cx = size.cy;      // Make the dimensions square
  90.         // Kludge for vertical text
  91.         BOOL bVertical = (GetFont()->lfEscapement == 900);
  92.         // Only draw if it'll fit!
  93.         if (size.cx + rect.left < rect.right+2)
  94.         {
  95.             int nTriangleBase = rect.bottom - nOffset - size.cy;    // Triangle bottom right
  96.             int nTriangleLeft;
  97.             if (bVertical)
  98.                 nTriangleLeft = (rect.right + rect.left - size.cx)/2; // Triangle middle
  99.             else
  100.                 nTriangleLeft = rect.right - size.cx;               // Triangle RHS
  101.             CPen penShadow(PS_SOLID, 0, /*::GetSysColor(COLOR_3DSHADOW)*/RGB(0,0,255));
  102.             //CPen penLight(PS_SOLID, 0, ::GetSysColor(COLOR_3DHILIGHT));
  103.             if (pGrid->GetSortAscending())//升序的
  104.             {
  105.                 // Draw triangle pointing upwards
  106. //画顶尖向上的三角形
  107.                 CPen *pOldPen = (CPen*) pDC->SelectObject(&penShadow/*penLight*/);
  108.                 pDC->MoveTo( nTriangleLeft-4 +(size.cx)/2, nTriangleBase +size.cy );
  109.                 pDC->LineTo( nTriangleLeft-4 +(size.cx)/2, nTriangleBase -(size.cy)/2-1);
  110.                 pDC->LineTo( nTriangleLeft-4 +(size.cx)-(size.cx)/4 , nTriangleBase+(size.cy)/4);
  111. pDC->MoveTo(nTriangleLeft-4 +(size.cx)/2, nTriangleBase-(size.cy)/2);
  112. pDC->LineTo( nTriangleLeft-4 +(size.cx)/4, nTriangleBase+(size.cy)/4 );
  113. pDC->SelectObject(pOldPen);
  114. }
  115. else
  116.             {
  117.                 // Draw triangle pointing downwards
  118. //画顶尖向下的三角形
  119.                 CPen *pOldPen = (CPen*) pDC->SelectObject(&penShadow);
  120.                 pDC->MoveTo( nTriangleLeft-4 + (size.cx )/ 2 , nTriangleBase - (size.cy)/2);
  121.                 pDC->LineTo( nTriangleLeft-4 + (size.cx )/ 2 , nTriangleBase + size.cy+1 );
  122.                 pDC->LineTo( nTriangleLeft-4 + (size.cx)- (size.cx)/4, nTriangleBase +(size.cy)/4);
  123. pDC->MoveTo(nTriangleLeft -4+ (size.cx )/2 , nTriangleBase + size.cy );
  124. pDC->LineTo(nTriangleLeft-4+(size.cx)/4 , nTriangleBase + (size.cy)/4 );
  125.                 pDC->SelectObject(pOldPen);
  126.             }
  127.             
  128.             if (!bVertical)
  129.                 rect.right -= size.cy;
  130.         }
  131.     }
  132.     //以上所有都是画单元格的
  133. pDC->SetTextColor(TextClr);
  134. //以下是负责显示文字的
  135.     // We want to see '&' characters so use DT_NOPREFIX
  136. // 我们想看见'&'字符....
  137. //    GetTextRect(rect);//文字要显示的位置
  138.     //DrawText(pDC->m_hDC, GetText(), -1, rect, GetFormat() | DT_NOPREFIX);
  139. DrawText(pDC->m_hDC, GetText(), -1, rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER/*DT_LEFT/*GetFormat() | DT_NOPREFIX*/);
  140. //画文字,DT_SINGLELINE|DT_BOTTOM|DT_RIGHT/*DT_LEFT*/是对齐方式的设定
  141.     //DT_SINGLELINE|DT_VCENTER|DT_RIGHT(垂直居中右对齐)
  142. //DT_SINGLELINE|DT_CENTER|(水平居中)
  143. //DT_SINGLELINE|DT_CENTER|DT_VCENTER(垂直水平都居中)
  144. //这几种组合都要结合DT_SINGLELINE设定才能见效
  145.     pDC->RestoreDC(nSavedDC);//恢复原DC模式(不透明)
  146.     return TRUE;
  147. }
  148. void CGridCellBase::operator=(const CGridCellBase& cell)
  149. {
  150. if (this == &cell) return;
  151.     SetGrid(cell.GetGrid());    // do first in case of dependencies
  152.     SetText(cell.GetText());
  153.     SetTextClr(cell.GetTextClr());
  154.     SetBackClr(cell.GetBackClr());
  155.     SetFont(cell.IsDefaultFont()? NULL : cell.GetFont());
  156.     
  157. }
  158. // Returns a pointer to a cell that holds default values for this particular type of cell
  159. CGridCellBase* CGridCellBase::GetDefaultCell() const
  160. {
  161.     if (GetGrid())//得到表格类的指针
  162. //返回保存在表格类中的缺省单元格的信息:
  163.         return GetGrid()->GetDefaultCell(IsFixedRow(), IsFixedCol());
  164.     return NULL;
  165. }