VertRuler.cpp
上传用户:wujian85
上传日期:2010-04-08
资源大小:227k
文件大小:4k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // VertRuler.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "printformeditor.h"
  5. #include "VertRuler.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CVertRuler
  13. CVertRuler::CVertRuler()
  14. {
  15. iFrom = 0;
  16. iTo = 2700;
  17. iDiv = 2;
  18. iPos = 0;
  19. iTextStep = 100;
  20. iGreatStep = 50;
  21. iSmallStep = 25;
  22. iTextDiv = 100;
  23. ft.CreatePointFont(90, "Arial");
  24. crBack = RGB(255,255,255);
  25. crText = RGB(0,0,0);
  26. crLines = RGB(0,0,0);
  27. yMouse = -10;
  28. }
  29. CVertRuler::~CVertRuler()
  30. {
  31. }
  32. BEGIN_MESSAGE_MAP(CVertRuler, CButton)
  33. //{{AFX_MSG_MAP(CVertRuler)
  34. ON_WM_ERASEBKGND()
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CVertRuler message handlers
  39. void CVertRuler::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  40. {
  41. int oym = yMouse;
  42. CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
  43. CRect rc(lpDrawItemStruct->rcItem);
  44. pDC->FillSolidRect(rc, crBack);
  45. int t;
  46. int iMin = iFrom;// + iPos;
  47. int iMax = iTo;//iMin + rc.Height() / iDiv;
  48. // if (iMax > iTo) iMax = iTo;
  49. int iRange = iMax - iMin;
  50. COLORREF crt = pDC->SetTextColor(crText);
  51. CFont * of   = pDC->SelectObject(&ft);
  52. UINT oa = pDC->SetTextAlign(TA_CENTER|TA_TOP);
  53. CString cs;
  54. CPen pn(PS_SOLID, 1, crLines);
  55. CPen * op = pDC->SelectObject(&pn);
  56. int r1 = rc.Width() / 3;
  57. int r2 = rc.Width() / 4;
  58. int r3 = rc.Width() / 2;
  59. CSize sz = pDC->GetTextExtent("X");
  60. int y1 = sz.cy / 2;
  61. for (t = iMin; t <= iMax / iDiv; t += iGreatStep / iDiv)
  62. {
  63. if (rc.top + t - iPos > 0 && rc.top + t - iPos <= rc.bottom)
  64. {
  65. pDC->MoveTo(rc.left + r2, rc.top + t - iPos);
  66. pDC->LineTo(rc.right -r2, rc.top + t - iPos);
  67. }
  68. if (rc.top + t - iPos > rc.bottom) break;
  69. }
  70. /* for (t = iMin; t < iMax; t += iSmallStep)
  71. {
  72. if (rc.top + t - iPos > 0 && rc.top + t - iPos < rc.bottom)
  73. {
  74. pDC->MoveTo(rc.left + r1, rc.top + t - iPos);
  75. pDC->LineTo(rc.right -r1, rc.top + t - iPos);
  76. }
  77. if (rc.top + t - iPos > rc.bottom) break;
  78. }
  79. */
  80. for (t = iMin; t <= iMax / iDiv; t += iTextStep / iDiv)
  81. {
  82. if (rc.top + t - iPos > 0 && rc.top + t - iPos <= rc.bottom)
  83. {
  84. cs.Format("%d", (iMin + t) *iDiv / iTextDiv);
  85. if (t <= iTo / iDiv)
  86. pDC->TextOut(rc.left + r3, rc.top + t - y1 - iPos, cs);
  87. // cs.Format("%d", t / iTextDiv);
  88. // pDC->TextOut(rc.left + t - iPos, rc.top, cs);
  89. }
  90. if (rc.top + t - iPos > rc.bottom) break;
  91. }
  92. pDC->SetTextColor(crt);
  93. pDC->SelectObject(of);
  94. pDC->SetTextAlign(oa);
  95. pDC->SelectObject(op);
  96. yMouse = -1;
  97. DrawMouse(oym);
  98. }
  99. void CVertRuler::SetPos(const int pos)
  100. {
  101. iPos = pos;
  102. if (iPos < iFrom) iPos = iFrom;
  103. if (GetSafeHwnd()) Invalidate();
  104. }
  105. void CVertRuler::SetRange(const int r1, const int r2)
  106. {
  107. iFrom = r1;
  108. iTo = r2;
  109. if (iPos < iFrom) iPos = iFrom;
  110. if (GetSafeHwnd()) Invalidate();
  111. }
  112. BOOL CVertRuler::OnEraseBkgnd(CDC* pDC) 
  113. {
  114. return true;
  115. // return CButton::OnEraseBkgnd(pDC);
  116. }
  117. void CVertRuler::DrawMouse(const int y)
  118. {
  119. if (y == yMouse) return;
  120. CRect rc;
  121. GetClientRect(rc);
  122. CClientDC dc(this);
  123. int orop = dc.SetROP2(R2_NOT);
  124. CPen pn(PS_DASHDOT, 1, RGB(0,0,0));
  125. CPen * op = dc.SelectObject(&pn);
  126. if (yMouse >= 0)
  127. {
  128. dc.MoveTo(rc.left, yMouse);
  129. dc.LineTo(rc.right, yMouse);
  130. }
  131. yMouse = y;
  132. if (yMouse >= 0)
  133. {
  134. dc.MoveTo(rc.left, yMouse);
  135. dc.LineTo(rc.right, yMouse);
  136. }
  137. dc.SetROP2(orop);
  138. dc.SelectObject(op);
  139. }