Graphics.cpp
上传用户:oy0519
上传日期:2008-01-20
资源大小:124k
文件大小:19k
源码类别:

绘图程序

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. //#include <windows.h>
  3. //#include <stdio.h>
  4. #include "graphics.h"
  5. ///////////////////////////////////////////////////////////////////////////////
  6. // class CGroupLines
  7. CGraphics::CGraphics()
  8. {
  9. m_Ratio.xmin = 0;
  10. m_Ratio.ymin = 0;
  11. m_Ratio.xmax = 1;
  12. m_Ratio.ymax = 1;
  13. m_nBackColor = RGB(255, 255, 255);
  14. m_nGridColor = RGB(192, 192, 192);
  15. m_nBorderColor = RGB(0, 0, 0);
  16. m_nTickColor = RGB(0, 0, 255);
  17. m_nTitleColor = RGB(255, 0, 0);
  18. m_nXDecimal = 0;
  19. m_nYDecimal = 0;
  20. XGridTicks = 10;
  21. YGridTicks = 10;
  22. XTicks = 50;
  23. YTicks = 50;
  24. m_bEnableLegend = true;
  25. m_bPrinting = false;
  26. m_bLegendShadow = true;
  27. m_bMemoryDraw = true;
  28. m_nPrintScale = 8;
  29. m_nAxesType = XY;
  30. m_nXStep = 0;
  31. m_nYStep = 0;
  32. m_LogFont.lfWidth = 0;
  33. m_LogFont.lfItalic = false;
  34. m_LogFont.lfUnderline = false;
  35. m_LogFont.lfStrikeOut = false;
  36. m_LogFont.lfCharSet = ANSI_CHARSET;
  37. m_LogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
  38. m_LogFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
  39. m_LogFont.lfQuality = PROOF_QUALITY;
  40. m_LogFont.lfPitchAndFamily = DEFAULT_PITCH;
  41. strcpy(m_LogFont.lfFaceName,"Ariel");
  42. crTable[0]  = RGB(255, 255, 255);     // White                  
  43.     crTable[1]  = RGB(  0,   0,   0);     // Black
  44. crTable[2]  = RGB(255,   0,   0);     // Red
  45. crTable[3]  = RGB(  0, 255,   0);     // Green
  46. crTable[4]  = RGB(  0,   0, 255);     // Blue
  47. crTable[5]  = RGB(255,   0, 255);     // Magenta
  48. crTable[6]  = RGB(  0, 255, 255);     // Cyan
  49. crTable[7]  = RGB(128, 128, 128);     // Grey
  50. crTable[8]  = RGB(128, 128,   0);     // Brown
  51. crTable[9]  = RGB(128,   0, 128);     // Purple
  52. crTable[10] = RGB(  0, 128, 128);     // Aqua
  53. crTable[11] = RGB(128,   0,   0);     // 
  54. crTable[12] = RGB(  0, 128,   0);     // 
  55. crTable[13] = RGB(  0,   0, 128);     // 
  56. crTable[14] = RGB(192, 192, 192);     // 
  57. crTable[15] = RGB(255, 255,   0);     // Yellow
  58. m_Bitmap    = 0;
  59. }
  60. void CGraphics::SetPrintScale(HDC& hDC, RECT& rect)
  61. {
  62. int Width     = ::GetDeviceCaps(hDC, HORZRES);
  63. int Height    = ::GetDeviceCaps(hDC, VERTRES);
  64. int wd   = abs(rect.right - rect.left);
  65. int ht   = abs(rect.bottom - rect.top);
  66. m_nPrintScale = (wd + ht) / (Width + Height);
  67. m_bPrinting   = true;
  68. RecalcRects(rect);
  69. }
  70. void CGraphics::RecalcRects(RECT& rt)
  71. {
  72. //m_Rect = rt;
  73. m_ClientRect = rt;
  74. SetPixelRect(rt);
  75. m_bM = (m_Rect.bottom - m_Rect.top) / 6;
  76. m_tM = (m_Rect.bottom - m_Rect.top) / 10;
  77. m_lM = m_rM = (m_Rect.right - m_Rect.left) / 8;
  78. m_PlotRect.left = m_Rect.left + m_lM;
  79. if (m_bEnableLegend)
  80. m_PlotRect.right= m_Rect.right - 3 * m_rM / 2;
  81. else
  82. m_PlotRect.right= m_Rect.right - m_rM;
  83. m_PlotRect.top = m_Rect.top + m_tM;
  84. m_PlotRect.bottom = m_Rect.bottom - m_bM;
  85. GL = m_PlotRect.left;
  86. GR = m_PlotRect.right;
  87. GT = m_PlotRect.top;
  88. GB = m_PlotRect.bottom;
  89. PX = GR - GL;
  90. PY = GB - GT;
  91. m_Scale.dx   = (m_Scale.xmax- m_Scale.xmin) / PX;
  92. m_Scale.dy   = (m_Scale.ymax- m_Scale.ymin) / PY;
  93. m_Size.cx = (PY < PX) ? PY : PX;
  94. }
  95. void CGraphics::BeginDraw(HDC hDC)
  96. if (m_bPrinting || !m_bMemoryDraw)
  97. m_hDC = hDC;
  98. else
  99. {
  100. ::GetClipBox(hDC, &m_ClipBox);
  101. m_hDC    = ::CreateCompatibleDC(hDC);
  102. m_Bitmap = ::CreateCompatibleBitmap(hDC, m_ClipBox.right - m_ClipBox.left, 
  103. m_ClipBox.bottom - m_ClipBox.top);
  104. m_OldBitmap = (HBITMAP)::SelectObject(m_hDC, m_Bitmap);
  105. ::SetWindowOrgEx(m_hDC, m_ClipBox.left, m_ClipBox.top, NULL);
  106. }
  107. DrawBkGround();
  108. }
  109. void CGraphics::EndDraw(HDC hDC)
  110. {
  111. if (m_bPrinting || !m_bMemoryDraw)
  112. {
  113. m_bPrinting = false;
  114. return;
  115. }
  116. ::BitBlt(hDC, m_ClipBox.left, m_ClipBox.top, m_ClipBox.right - m_ClipBox.left,
  117.  m_ClipBox.bottom - m_ClipBox.top, m_hDC, m_ClipBox.left, m_ClipBox.top, SRCCOPY);
  118. ::SelectObject(m_hDC, m_OldBitmap);
  119. ::DeleteObject(m_Bitmap);
  120. ::DeleteDC(m_hDC);
  121. }
  122. void CGraphics::DrawBkGround()
  123. {
  124. HBRUSH hBrush = ::CreateSolidBrush(m_nBackColor);
  125.     HBRUSH hBrold = (HBRUSH)::SelectObject(m_hDC, hBrush);
  126. ::Rectangle(m_hDC, m_ClientRect.left, m_ClientRect.top, 
  127. m_ClientRect.right, m_ClientRect.bottom);
  128.     ::SelectObject(m_hDC, hBrold);
  129.     ::DeleteObject(hBrush);
  130. }
  131. void CGraphics::SetRatio(double xmin, double ymin, double xmax, double ymax)
  132. {
  133. m_Ratio.xmin = xmin;
  134. m_Ratio.ymin = ymin;
  135. m_Ratio.xmax = xmax;
  136. m_Ratio.ymax = ymax;
  137. }
  138. void CGraphics::GetPixelRect(RECT& rt)
  139. {
  140. rt.left   = m_Rect.left;
  141. rt.top   = m_Rect.top;
  142. rt.right  = m_Rect.right;
  143. rt.bottom = m_Rect.bottom;
  144. }
  145. void CGraphics::SetPixelRect(RECT rt)
  146. {
  147. LONG Width    = rt.right  - rt.left;
  148.     LONG Height   = rt.bottom - rt.top; 
  149. m_Rect.left   = (LONG)(rt.left + m_Ratio.xmin * Width);
  150. m_Rect.top   = (LONG)(rt.top + m_Ratio.ymin * Height);
  151. m_Rect.right  = (LONG)(rt.right - (1 - m_Ratio.xmax) * Width);
  152. m_Rect.bottom = (LONG)(rt.bottom - (1 - m_Ratio.ymax) * Height);
  153. }
  154. void CGraphics::Title(const char* Title, int Pos)
  155. {
  156. m_LogFont.lfHeight = (int)(m_Size.cx / -15.0);
  157. if (m_LogFont.lfHeight > -10) 
  158. m_LogFont.lfHeight = -10;
  159. m_LogFont.lfWeight    = 700;
  160. m_LogFont.lfOrientation= 0;
  161. m_LogFont.lfEscapement = 0;
  162. m_Font = ::CreateFontIndirect(&m_LogFont);
  163. if (m_Font)
  164. {
  165.    int bm  = ::SetBkMode(m_hDC, TRANSPARENT);
  166. HFONT hOldFont = (HFONT)::SelectObject(m_hDC, m_Font);
  167. ::SetTextColor(m_hDC, RGB(0, 0, 0)); 
  168. SetStringAlign(CENTER, CENTER);
  169. if (Pos == TOP)
  170. {
  171. PrintString((GL + GR) / 2, (m_Rect.top + GT ) / 2 + 1, 0, Title);
  172. ::SetTextColor(m_hDC, m_nTitleColor); 
  173. PrintString((GL + GR) / 2, (m_Rect.top + GT ) / 2, 0, Title);
  174. }
  175. else
  176. {
  177. int n = m_Rect.bottom - (m_Rect.bottom - GB) / 3;
  178. PrintString((GL + GR) / 2, n + 1, 0, Title);
  179. ::SetTextColor(m_hDC, m_nTitleColor); 
  180. PrintString((GL + GR) / 2, n, 0, Title);
  181. }
  182. ::SelectObject(m_hDC, hOldFont);
  183. ::DeleteObject(m_Font);
  184. ::SetBkMode(m_hDC, bm);
  185. }
  186. }
  187. void CGraphics::XAxisTitle(const char* Title, int Pos)
  188. {
  189. m_LogFont.lfHeight = (int)(m_Size.cx / -20.0);
  190. if (m_LogFont.lfHeight > -10) 
  191. m_LogFont.lfHeight = -10;
  192. m_LogFont.lfWeight    = 700;
  193. m_LogFont.lfOrientation= 0;
  194. m_LogFont.lfEscapement = 0;
  195. m_Font = ::CreateFontIndirect(&m_LogFont);
  196. if (m_Font)
  197. {
  198.    int bm  = ::SetBkMode(m_hDC, TRANSPARENT);
  199. HFONT hOldFont = (HFONT)::SelectObject(m_hDC, m_Font);
  200. ::SetTextColor(m_hDC, m_nTitleColor); 
  201. SetStringAlign(CENTER, CENTER);
  202. if (Pos == TOP)
  203. PrintString((GL + GR) / 2, (m_Rect.top + GT ) / 2, 0, Title);
  204. else
  205. PrintString((GL + GR) / 2, m_Rect.bottom - (m_Rect.bottom - GB) / 3, 0, Title);
  206. ::SelectObject(m_hDC, hOldFont);
  207. ::DeleteObject(m_Font);
  208. ::SetBkMode(m_hDC, bm);
  209. }
  210. }
  211. void CGraphics::YAxisTitle(const char* Title, int Pos)
  212. {
  213. m_LogFont.lfHeight = (int)(m_Size.cx / -20.0);
  214. if (m_LogFont.lfHeight > -10) 
  215. m_LogFont.lfHeight = -10;
  216. m_LogFont.lfWeight    = 700;
  217. if (Pos == LEFT)
  218. {
  219. m_LogFont.lfOrientation= 900;
  220. m_LogFont.lfEscapement = 900;
  221. }
  222. else
  223. {
  224. m_LogFont.lfOrientation= -900;
  225. m_LogFont.lfEscapement = -900;
  226. }
  227. m_Font = ::CreateFontIndirect(&m_LogFont);
  228. if (m_Font)
  229. {
  230.    int bm  = ::SetBkMode(m_hDC, TRANSPARENT);
  231. HFONT hOldFont = (HFONT)::SelectObject(m_hDC, m_Font);
  232. ::SetTextColor(m_hDC, m_nTitleColor); 
  233. SetStringAlign(CENTER, CENTER);
  234. if (Pos == LEFT)
  235. PrintString(m_Rect.left + (GL - m_Rect.left) / 3, (GT + GB) / 2, 90, Title);
  236. else
  237. PrintString(m_Rect.right - (m_Rect.right - GR) / 3, (GT + GB) / 2, -90, Title);
  238. ::SelectObject(m_hDC, hOldFont);
  239. ::DeleteObject(m_Font);
  240. ::SetBkMode(m_hDC, bm);
  241. }
  242. }
  243. void CGraphics::DrawBoundary(COLORREF cr, int size)
  244. {
  245. HPEN hPen = ::CreatePen(PS_SOLID, size, cr);
  246. HPEN hOldPen = (HPEN)::SelectObject(m_hDC, hPen);
  247. int n = 5;
  248. if (m_bPrinting) n *= m_nPrintScale;
  249. DrawRectangle(m_Rect.left + n, m_Rect.top + n, 
  250.   m_Rect.right - n, m_Rect.bottom - n);
  251.     ::SelectObject(m_hDC, hOldPen);
  252.     ::DeleteObject(hPen);  
  253. }
  254. void CGraphics::Legend(COLORREF cr, int Index, const char* Name)
  255. {
  256. m_LogFont.lfHeight = (int)(m_Size.cx / -25.0);
  257. if (m_LogFont.lfHeight > -10) 
  258. m_LogFont.lfHeight = -10;
  259. m_LogFont.lfWeight    = 500;
  260. m_LogFont.lfOrientation= 0;
  261. m_LogFont.lfEscapement = 0;
  262. m_Font = ::CreateFontIndirect(&m_LogFont);
  263. if (m_Font)
  264. {
  265. int n  = (m_Rect.right - GR) / 20 + 1;
  266. int xb = GR + 2 * n;
  267. int xe = xb + 4 * n;
  268. int y  = GT - 3 * Index * m_LogFont.lfHeight / 2;
  269. DrawLine(xb, y, xe, y);
  270.    int bm  = ::SetBkMode(m_hDC, TRANSPARENT);
  271. HFONT hOldFont = (HFONT)::SelectObject(m_hDC, m_Font);
  272. ::SetTextColor(m_hDC, cr); 
  273. SetStringAlign(LEFT, CENTER);
  274. PrintString(xe + n, y, 0, Name);
  275. ::SelectObject(m_hDC, hOldFont);
  276. ::DeleteObject(m_Font);
  277. ::SetBkMode(m_hDC, bm);
  278. }
  279. }
  280. void CGraphics::DrawCircle(int x, int y, int radius)
  281. {
  282.     int x1 = x - radius;
  283.     int y1 = y - radius;
  284.     int x2 = x + radius;
  285.     int y2 = y + radius;
  286. ::Arc(m_hDC, x1, y1, x2, y2, x, y2, x, y2);
  287. }
  288. void CGraphics::DrawFilledCircle(int x, int y, int radius)
  289. {
  290.     int x1 = x - radius;
  291.     int y1 = y - radius;
  292.     int x2 = x + radius;
  293.     int y2 = y + radius;
  294.     ::Ellipse(m_hDC, x1, y1, x2, y2);
  295. }
  296. void CGraphics::DrawRectangle(int x1, int y1, int x2, int y2)
  297. {
  298. ::MoveToEx(m_hDC, x1, y1, NULL);
  299. ::LineTo(m_hDC, x1, y2);
  300. ::LineTo(m_hDC, x2, y2);
  301. ::LineTo(m_hDC, x2, y1);
  302. ::LineTo(m_hDC, x1, y1);
  303. }
  304. void CGraphics::PrintString(int x, int y, int theta, const char* fmt)
  305. {
  306. WORD    Height, Width;
  307. UINT    PreSet;
  308. double  thta;
  309. PreSet = ::SetTextAlign(m_hDC, TA_LEFT|TA_TOP);
  310. SIZE  size;
  311. ::GetTextExtentPoint32(m_hDC, fmt, lstrlen(fmt), &size);
  312. Height = (WORD)size.cy;
  313. Width  = (WORD)size.cx;
  314.                                              
  315.     thta   = PiV*theta/ConstV;
  316.     if(m_StrAlign.HAlign == LEFT && m_StrAlign.VAlign == TOP)
  317. {
  318.     else if(m_StrAlign.HAlign == LEFT && m_StrAlign.VAlign == CENTER)
  319. {     
  320. x = (int)(x - Height/2.*sin(thta));
  321. y = (int)(y - Height/2.*cos(thta));
  322. }
  323.     else if(m_StrAlign.HAlign == CENTER && m_StrAlign.VAlign == TOP)
  324. {
  325. x = (int)(x - Width/2. * cos(thta));
  326. y = (int)(y + Width/2. * sin(thta));
  327. }
  328.     else if(m_StrAlign.HAlign == CENTER && m_StrAlign.VAlign == CENTER)
  329. {
  330. x = (int)(x - Width/2. * cos(thta) - Height/2.*sin(thta));
  331. y = (int)(y + Width/2. * sin(thta) - Height/2.*cos(thta));
  332. }
  333.     else if(m_StrAlign.HAlign == CENTER && m_StrAlign.VAlign == BOTTOM)
  334. {
  335. x = (int)(x - Width/2. * cos(thta) - Height*sin(thta));
  336. y = (int)(y + Width/2. * sin(thta) - Height*cos(thta));
  337. }
  338.     else if(m_StrAlign.HAlign == RIGHT && m_StrAlign.VAlign == TOP)
  339. {
  340. x = (int)(x - Width * cos(thta));
  341. y = (int)(y + Width * sin(thta));
  342. }
  343.     else if(m_StrAlign.HAlign == RIGHT && m_StrAlign.VAlign == CENTER)
  344. {
  345. x = (int)(x - Width * cos(thta) - Height/2.*sin(thta));
  346. y = (int)(y + Width * sin(thta) - Height/2.*cos(thta));
  347. }
  348.     else if(m_StrAlign.HAlign == RIGHT && m_StrAlign.VAlign == BOTTOM)
  349. {
  350. x = (int)(x - Width * cos(thta) - Height*sin(thta));
  351. y = (int)(y + Width * sin(thta) - Height*cos(thta));
  352. }
  353.     else //if(m_StrAlign.HAlign == LEFT && m_StrAlign.VAlign == BOTTOM)
  354. {             
  355. x = (int)(x - Height*sin(thta));
  356. y = (int)(y - Height*cos(thta));
  357. }                 
  358. ::TextOut(m_hDC, x, y, fmt, lstrlen(fmt));
  359. ::SetTextAlign(m_hDC, PreSet);
  360. }
  361. void CGraphics::Format(int decimal, char* str, float value)
  362. {
  363. char tstr[24];
  364. switch(decimal)
  365. {
  366. case 0:
  367. sprintf(str, "%.f", value);
  368. return;
  369. case 1:
  370. sprintf(tstr, "%.1f", value);
  371. break;
  372. case 2:
  373. sprintf(tstr, "%.2f", value);
  374. break;
  375. case 3:
  376. sprintf(tstr, "%.3f", value);
  377. break;
  378. case 4:
  379. sprintf(tstr, "%.4f", value);
  380. break;
  381. default:
  382. sprintf(tstr, "%.5f", value);
  383. break;
  384. }
  385. if (fabs(value) > 0.99999)
  386. {
  387. _gcvt(atof(tstr), 12, str);
  388. if (str[lstrlen(str)-1] == '.')
  389. str[lstrlen(str)-1] = '';
  390. }
  391. else
  392. {
  393. if (fabs(value) <1.0e-10)
  394. lstrcpy(str, "0");
  395. else
  396. {
  397. lstrcpy(str, tstr);
  398. int n = lstrlen(str) - 1;
  399. while(str[n] == '0' && n >= 0)
  400. str[n--] = '';
  401. }
  402. }
  403. }
  404. void CGraphics::Grid()
  405. {
  406. int i, j;                                    
  407.                 
  408. HPEN hPen = ::CreatePen(PS_DOT, 0, m_nGridColor);
  409. HPEN hOldPen = (HPEN)::SelectObject(m_hDC, hPen);
  410. for(i = 1; i < XGridTicks; i ++)
  411. {
  412. j = GL + (int)(1.0 * i * (GR-GL) / XGridTicks);
  413. DrawLine(j, GT + 1, j, GB - 1);
  414. }
  415. for(i = 1; i < YGridTicks; i ++) 
  416. {
  417. j = GT + (int)(1.0 * i * (GB-GT) / YGridTicks);
  418. DrawLine(GL + 1, j, GR - 1, j);
  419. }
  420. ::SelectObject(m_hDC, hOldPen);
  421. ::DeleteObject(hPen);
  422. }
  423. void CGraphics::XAxis()
  424. {
  425. int   xb, yb, xe, ye;   
  426.     int   i, j;                                  
  427. char  str[32];
  428. float value;
  429. yb=GB;
  430. j = XTicks / 10;
  431. for(i = 0; i <= XTicks; i ++) 
  432. {
  433. xb = xe = (int)(GL + 1.0 * PX * i / XTicks );
  434. if((i % j) == 0)
  435. {
  436. ye = GB + m_bM / 7;
  437. value = (float)(m_Scale.xmin + i * (m_Scale.xmax - m_Scale.xmin) / XTicks);
  438. Format(m_nXDecimal, str, value);
  439. PrintString(xb, GB + m_bM / 5, 0, str);
  440. }
  441. else 
  442. ye = GB + m_bM / 14;
  443. if (i > 0 && i < XTicks)
  444. DrawLine(xb, yb, xe, ye);
  445. }
  446. }
  447. void CGraphics::YAxis()
  448. {
  449.     int   xb, yb, xe, ye;   
  450.     int   i, j;                                  
  451. char  str[32];
  452. float value;
  453. xe = GL;
  454. j = YTicks / 10;
  455. for(i = 0; i <= YTicks; i ++)     
  456. {
  457. yb = ye = (int)(GT + 1.0 * PY * i / YTicks );
  458. if((i % j) == 0) 
  459. {
  460. xb = GL - m_lM / 10;
  461. value = (float)(m_Scale.ymax - i * (m_Scale.ymax - m_Scale.ymin) / YTicks);
  462. Format(m_nYDecimal, str, value);
  463. PrintString(GL - m_lM / 6, yb, 0, str);
  464. }
  465. else
  466. xb = GL - m_lM / 20;
  467. if (i > 0 && i < YTicks)
  468. DrawLine(xb, yb, xe, ye);
  469. }    
  470. }
  471. void CGraphics::Ticks()
  472. {
  473. SetStringAlign(CENTER, TOP);
  474. XAxis();
  475. SetStringAlign(RIGHT, CENTER);
  476. YAxis();
  477. }
  478. void CGraphics::RightYTick()
  479. {
  480. if (m_bEnableLegend)
  481. return;
  482.     int   xb, yb, xe, ye;   
  483.     int   i, j, k;                                  
  484. char  str[32];
  485. float value;
  486. xb = GR;
  487. SetStringAlign(LEFT, CENTER);
  488. if (m_nAxesType == XY || m_nAxesType == XLOG)
  489. {
  490. j = YTicks / 10;
  491. for(i = 0; i <= YTicks; i ++)     
  492. {
  493. yb = ye = (int)(GT + 1.0 * PY * i / YTicks );
  494. if((i % j) == 0) 
  495. {
  496. xe = GR + m_rM / 10;
  497. value = (float)(m_Scale.ymax - i * (m_Scale.ymax - m_Scale.ymin) / YTicks);
  498. Format(m_nYDecimal, str, value);
  499. PrintString(GR + m_rM / 6, yb, 0, str);
  500. }
  501. else
  502. xe = GR + m_rM / 20;
  503. if (i > 0 && i < YTicks)
  504. DrawLine(xb, yb, xe, ye);
  505. }
  506. }
  507. else
  508. {
  509. for(i = 1; i <= m_nYStep; i ++)
  510. {
  511. for(j = 1; j <= 10; j ++)
  512. {
  513. if (k == 0)   
  514. xe = GR + m_rM / 10;
  515. else
  516. xe = GR + m_rM / 20;
  517. yb = ye = GB - (int)(log10(j) * PY / m_nYStep + 1.0 * (i - 1) * PY / m_nYStep);
  518. if (j == 1)
  519. {
  520. value = (float)(pow(10.0, m_Scale.ymin) * pow(10.0, i - 1));
  521. Format(m_nYDecimal, str, value);
  522. PrintString(GR + m_rM / 6, yb, 0, str);
  523. }
  524. if ((i != 1 || j != 1) && (i != m_nYStep || j != 10))
  525. DrawLine(xb, yb, xe, ye);
  526. k = 1;
  527. }
  528. k=0;
  529. }
  530. value = (float)(pow(10.0, m_Scale.ymin) * pow(10.0, i - 1));
  531. Format(m_nYDecimal, str, value);
  532. PrintString(GR + m_rM / 6, yb, 0, str);
  533. }
  534. }
  535. void CGraphics::Axes()
  536. {
  537.    int bm  = ::SetBkMode(m_hDC, TRANSPARENT);
  538.     HPEN hPen    = ::CreatePen(PS_SOLID, 0, m_nBorderColor);
  539.     HPEN hOldPen = (HPEN)::SelectObject(m_hDC, hPen);
  540. DrawRectangle(GL, GT, GR, GB);
  541. m_LogFont.lfHeight = (int)(m_Size.cx / -25.0);
  542. if (m_LogFont.lfHeight > -10) 
  543. m_LogFont.lfHeight = -10;
  544. m_LogFont.lfWeight     = 500;
  545. m_LogFont.lfOrientation= 0;
  546. m_LogFont.lfEscapement = 0;
  547. m_Font = ::CreateFontIndirect(&m_LogFont);
  548. if (m_Font)
  549. {
  550. HFONT hOldFont = (HFONT)::SelectObject(m_hDC, m_Font);
  551. SetTextColor(m_hDC, m_nTickColor); 
  552. Ticks();
  553. RightYTick();
  554. ::SelectObject(m_hDC, hOldFont);
  555. ::DeleteObject(m_Font);
  556. }
  557.     ::SelectObject(m_hDC, hOldPen);
  558.     ::DeleteObject(hPen);  
  559. ::SetBkMode(m_hDC, bm);
  560. }
  561. void CGraphics::DrawMarker(int x, int y, int mode, int n)
  562. {
  563. if (m_bPrinting) n *= m_nPrintScale;
  564.     switch(mode)
  565. {
  566. case CROSS:
  567. DrawLine(x - n, y, x + n, y );
  568. DrawLine(x, y - n, x, y + n );
  569. break;
  570. case STAR:
  571. DrawLine(x - n, y, x + n, y );
  572. DrawLine(x - n / 2, (int)(y + n * sqrt(3.) / 2), x + n / 2, 
  573. (int)(y - n * sqrt(3.) / 2));
  574. DrawLine(x - n / 2, (int)(y - n * sqrt(3.) / 2), x + n / 2, 
  575. (int)(y + n * sqrt(3.) / 2));
  576. break;
  577. case FCIRCLE:
  578. DrawFilledCircle(x, y, n);
  579. break;
  580. case FTRIANGLE:
  581. {
  582. POINT  p[3];
  583. p[0].x = x - n;
  584. p[0].y = (int)(y + n * sqrt(3.) / 3);
  585. p[1].x = x + n;
  586. p[1].y = (int)(y + n * sqrt(3.) / 3);
  587. p[2].x = x;
  588. p[2].y = (int)(y - 2 * n * sqrt(3.) / 3);
  589. ::Polygon(m_hDC, p, 3);
  590. break;
  591. }
  592. case XCROSS:
  593. DrawLine((int)(x + n * sqrt(2.) / 2),
  594.  (int)(y - n * sqrt(2.) / 2), 
  595.  (int)(x - n * sqrt(2.) / 2),
  596.  (int)(y + n * sqrt(2.) / 2));
  597. DrawLine((int)(x - n * sqrt(2.) / 2),
  598.  (int)(y - n * sqrt(2.) / 2), 
  599.  (int)(x + n * sqrt(2.) / 2),
  600.  (int)(y + n * sqrt(2.) / 2));
  601. break;
  602. case CIRCLE:
  603. DrawCircle(x, y, n);
  604. break;
  605. case TRIANGLE:
  606. DrawLine(x - n, (int)(y + n * sqrt(3.) / 3),
  607.  x + n, (int)(y + n * sqrt(3.) / 3));
  608. DrawLine(x + n, (int)(y + n * sqrt(3.) / 3),
  609.  x, (int)(y - 2 * n * sqrt(3.) / 3));
  610. DrawLine(x, (int)(y - 2 * n * sqrt(3.) / 3),
  611.  x - n, (int)(y + n * sqrt(3.) / 3));  
  612. break;
  613. case FSQUARE:
  614. ::Rectangle(m_hDC, x - n, y - n, x + n, y + n);
  615. break;
  616. case SQUARE:      
  617. DrawRectangle(x - n, y - n, x + n, y + n );
  618. break;
  619. case FDIAMOND:
  620. {
  621. POINT  p[4];
  622. p[0].x = x - n;
  623. p[0].y = y;
  624. p[1].x = x;
  625. p[1].y = y + n;
  626. p[2].x = x + n;
  627. p[2].y = y;
  628. p[3].x = x;
  629. p[3].y = y - n;
  630. ::Polygon(m_hDC, p, 4);
  631. break;
  632. }
  633. case DIAMOND:
  634. ::MoveToEx(m_hDC, x - n, y, NULL);
  635. ::LineTo(m_hDC, x, y + n);
  636. ::LineTo(m_hDC, x + n, y);
  637. ::LineTo(m_hDC, x, y - n);
  638. ::LineTo(m_hDC, x - n, y);
  639. break;
  640. }
  641. }
  642. void CGraphics::DrawShadow(int n)
  643. {
  644. HPEN m_CurPen = ::CreatePen(PS_SOLID, 0, RGB(127,127,127));
  645. HPEN m_OldPen = (HPEN)::SelectObject(m_hDC, m_CurPen);
  646. HBRUSH hBrush = ::CreateSolidBrush(RGB(127,127,127));
  647. HBRUSH hBrold = (HBRUSH)::SelectObject(m_hDC, hBrush);
  648. int w  = (m_Rect.right - GR) / 20 + 1;
  649. int xb = GR + 2 * n;
  650. ::Rectangle(m_hDC, GR + (int)(2.2 * w), GT - m_LogFont.lfHeight, 
  651. m_Rect.right - (int)(0.8 * w), GT - 2 * (n + 1) * m_LogFont.lfHeight);
  652. ::SelectObject(m_hDC, hBrold);
  653. ::DeleteObject(hBrush);
  654. ::SelectObject(m_hDC, m_OldPen);
  655. ::DeleteObject(m_CurPen);
  656. hBrush = ::CreateSolidBrush(RGB(255, 255, 255));
  657. hBrold = (HBRUSH)::SelectObject(m_hDC, hBrush);
  658. ::Rectangle(m_hDC, GR + w, GT, m_Rect.right - 2 * w, 
  659. GT - 2 * (n + 1) * m_LogFont.lfHeight + m_LogFont.lfHeight);
  660. ::SelectObject(m_hDC, hBrold);
  661. ::DeleteObject(hBrush);
  662. }