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

金融证券系统

开发平台:

Visual C++

  1. // SingleView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyStock.h"
  5. #include "SingleView.h"
  6. #include "MyStockDoc.h"
  7. #include "math.h"
  8. #include "fstream.h" //文件操作
  9. #include "MainFrm.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CSingleView
  17. IMPLEMENT_DYNCREATE(CSingleView, CView)
  18. CSingleView::CSingleView()
  19. {
  20. jan=0;
  21. Save_am=0;
  22. m_x=0;//K线X坐标
  23. pp=0;
  24. an=0;
  25. m_KWidth=4;
  26. zx=m_KWidth/2/2; //1/2 or 1/4?
  27. m_paintnum=3;
  28. m_Line1Color=RGB(0,32,255);
  29. m_Line2Color=RGB(22,171,18);
  30. m_Line3Color=RGB(255,0,255);
  31. // TODO: add construction code here
  32. }
  33. CSingleView::~CSingleView()
  34. {
  35. }
  36. BEGIN_MESSAGE_MAP(CSingleView, CView)
  37. //{{AFX_MSG_MAP(CSingleView)
  38. ON_WM_DESTROY()
  39. ON_WM_MOUSEMOVE()
  40. ON_WM_LBUTTONDOWN()
  41. ON_WM_LBUTTONUP()
  42. ON_COMMAND(ID_KLINE, OnKline)
  43. //}}AFX_MSG_MAP
  44. END_MESSAGE_MAP()
  45. /////////////////////////////////////////////////////////////////////////////
  46. // CSingleView drawing
  47. void CSingleView::OnDraw(CDC* pDC)
  48. {
  49. CMyStockDoc* pDoc =(CMyStockDoc*)GetDocument();
  50. CString str=pDoc->m_FileName;
  51. BOOL iskline=((CMyStockApp*)AfxGetApp())->m_bIsKLine;
  52. if(iskline)
  53. {
  54. MyKLine(pDC,3); //myline2
  55.     KLine(); //dataradey
  56.     KDJ(9);
  57.     MACD(26,12,9);
  58. }
  59. else
  60. {
  61. Myline(pDC);
  62. }
  63. }
  64. /////////////////////////////////////////////////////////////////////////////
  65. // CSingleView diagnostics
  66. #ifdef _DEBUG
  67. void CSingleView::AssertValid() const
  68. {
  69. CView::AssertValid();
  70. }
  71. void CSingleView::Dump(CDumpContext& dc) const
  72. {
  73. CView::Dump(dc);
  74. }
  75. #endif //_DEBUG
  76. /////////////////////////////////////////////////////////////////////////////
  77. // CSingleView message handlers
  78. void CSingleView::OnDestroy() 
  79. {
  80. CView::OnDestroy();
  81. CMainFrame::bChilcCreated=FALSE;
  82. }
  83. void CSingleView::Myline(CDC *pDC)
  84. {
  85. CMyStockDoc* pDoc =(CMyStockDoc*)GetDocument();
  86. pDC->TextOut(5,2,pDoc->m_FileName);
  87. RECT rect;
  88. GetClientRect(&rect);
  89. int bj=(rect.right/4)*3;
  90. int aa=(rect.bottom-40)/25;
  91. int aa1=(rect.bottom-40)%25;
  92. if(25-aa1<5)
  93. {
  94. aa+=1;
  95. }
  96. int bb=(rect.right/4)*3;
  97. pDC->MoveTo(50,(aa/3)*2*25+21);
  98. pDC->LineTo(bb-50,(aa/3)*2*25+21);//成交量和走势线的分界
  99. pDC->MoveTo(50,(aa/3)*25+21);
  100. pDC->LineTo(bb-50,(aa/3)*25+21);//昨收盘线
  101. pDC->MoveTo(bb,0);
  102. pDC->LineTo(bb,rect.bottom);
  103. pDC->MoveTo(bb-50,0);
  104. pDC->LineTo(bb-50,rect.bottom);
  105. for(int i=0;i<=aa;i++)
  106. {
  107. pDC->MoveTo(50,25*i+20);
  108. pDC->LineTo(bb-50,25*i+20);
  109. }
  110. int cc=(bb-100)/4;
  111. for(int j=0;j<4;j++)
  112. {
  113. pDC->MoveTo(50+cc*j,20);
  114. pDC->LineTo(50+cc*j,20+25*aa);
  115. }
  116. CPen pen(PS_DOT,1,RGB(128,128,128));
  117. CPen* pPen=pDC->SelectObject(&pen);
  118. int mm=(bb-100)/8;
  119. for(int d=0;d<4;d++)
  120. {
  121. pDC->MoveTo(50+mm*(2*d+1),20);
  122. pDC->LineTo(50+mm*(2*d+1),20+25*aa);
  123. }
  124. pDC->SelectObject(pPen);
  125. CString str=pDoc->m_FileName;
  126. pDC->TextOut(bj+10,2,str+"  股票名称(序号)");
  127. pDC->MoveTo(bj,21);
  128. pDC->LineTo(rect.right,21);
  129. pDC->TextOut(bj+3,22,"委比       委差");
  130. pDC->MoveTo(bj,41);
  131. pDC->LineTo(rect.right,41);
  132. pDC->TextOut(bj+3,42,"卖四");
  133. pDC->TextOut(bj+3,62,"卖三");
  134. pDC->TextOut(bj+3,82,"卖二");
  135. pDC->TextOut(bj+3,102,"卖一");
  136. pDC->MoveTo(bj,121);
  137. pDC->LineTo(rect.right,121);
  138. pDC->TextOut(bj+3,122,"买一");
  139. pDC->TextOut(bj+3,142,"买二");
  140. pDC->TextOut(bj+3,162,"买三");
  141. pDC->TextOut(bj+3,182,"买四");
  142. pDC->MoveTo(bj,201);
  143. pDC->LineTo(rect.right,201);
  144. pDC->TextOut(bj+3,202,"最新");
  145. pDC->TextOut(bj+3,222,"涨跌");
  146. pDC->TextOut(bj+3,242,"幅度");
  147. pDC->TextOut(bj+3,262,"总手");
  148. pDC->TextOut(bj+3,282,"现手");
  149. pDC->TextOut(bj+3,302,"金额");
  150. pDC->MoveTo(bj,321);
  151. pDC->LineTo(rect.right,321);
  152. //m_edit->SetWindowPos(&wndBottom,bj+1,322,rect.right,rect.bottom,SWP_DRAWFRAME);
  153. //m_edit->SetWindowText("amcbefg")
  154. }
  155. int CSingleView::MyKLine(CDC *pDC, int Num)
  156. {
  157. RECT rect;
  158. GetClientRect(&rect);
  159. int bj=(rect.right/4)*3;
  160. if(pp==0)
  161. {
  162. SetPointY(Num);
  163. }
  164. CPen mypen(PS_SOLID,1,RGB(128,128,128));
  165. CPen* myoldpen=pDC->SelectObject(&mypen);
  166. for(int k=0;k<=Num-1;k++)
  167. {
  168. pDC->MoveTo(1,m_pointY[k]);
  169. pDC->LineTo(bj,m_pointY[k]);
  170. char str[4];
  171. gcvt(k,2,str);
  172. pDC->SetTextColor(RGB(255,0,255));
  173. pDC->TextOut(100,m_pointY[k]-18,str);
  174. }
  175. pDC->SetTextColor(RGB(0,0,0));
  176. pDC->MoveTo(bj,0);
  177. pDC->LineTo(bj,rect.bottom);
  178. pDC->MoveTo(bj-50,0);
  179. pDC->LineTo(bj-50,rect.bottom);
  180. CMyStockDoc* pDoc = (CMyStockDoc*)GetDocument();
  181. CString str=pDoc->m_FileName;
  182. pDC->TextOut(bj+10,2,str+"  股票名称(序号)");
  183. pDC->MoveTo(bj,21);
  184. pDC->LineTo(rect.right,21);
  185. pDC->TextOut(bj+3,22,"委比"/*       委差"*/);
  186. pDC->MoveTo(bj,41);
  187. pDC->LineTo(rect.right,41);
  188. pDC->TextOut(bj+3,42,"卖四");
  189. pDC->TextOut(bj+3,62,"卖三");
  190. pDC->TextOut(bj+3,82,"卖二");
  191. pDC->TextOut(bj+3,102,"卖一");
  192. pDC->MoveTo(bj,121);
  193. pDC->LineTo(rect.right,121);
  194. pDC->TextOut(bj+3,122,"买一");
  195. pDC->TextOut(bj+3,142,"买二");
  196. pDC->TextOut(bj+3,162,"买三");
  197. pDC->TextOut(bj+3,182,"买四");
  198. pDC->MoveTo(bj,201);
  199. pDC->LineTo(rect.right,201);
  200. pDC->TextOut(bj+3,202,"最新");
  201. pDC->TextOut(bj+3,222,"涨跌");
  202. pDC->TextOut(bj+3,242,"幅度");
  203. pDC->TextOut(bj+3,262,"总手");
  204. pDC->TextOut(bj+3,282,"现手");
  205. pDC->TextOut(bj+3,302,"金额");
  206. pDC->MoveTo(bj,321);
  207. pDC->LineTo(rect.right,321);
  208. pDC->SelectObject(myoldpen);
  209. return 0;
  210. }
  211. void CSingleView::SetPointY(int Num)
  212. {
  213. RECT rect;
  214. GetClientRect(&rect);
  215. for(int i=0;i<Num;i++)
  216. {
  217. m_pointY[i]=(rect.bottom/(Num+5))*(6+i);
  218. }
  219. m_pointY[Num-1]=rect.bottom;
  220. }
  221. void CSingleView::KLine()
  222. {
  223. CDC* pDC=GetDC();
  224. RECT rect;
  225. GetClientRect(&rect);
  226. int mmx=(rect.right/4)*3;
  227. m_days=(mmx-50)/(m_KWidth+1);//得到画面的周期数
  228. Save_am=m_days;
  229. CMyStockDoc* pDoc=(CMyStockDoc*)GetDocument();
  230. CString filename=pDoc->m_FileName;
  231. filename=".\DAY\"+filename;
  232. filename+=".day";
  233. ifstream infile(filename,ios::binary);
  234. infile.seekg(0,ios::end);
  235. int fsize=infile.tellg();
  236. if(fsize==0)
  237. return;
  238. pDC->TextOut(5,2,pDoc->m_FileName);
  239. an=fsize/sizeof(RCV_HISTORY_STRUCTEx);//得到股票数据的天数
  240. //RCV_HISTORY_STRUCTEx* rx= new RCV_HISTORY_STRUCTEx[an];//定义数组
  241. CArray<RCV_HISTORY_STRUCTEx,RCV_HISTORY_STRUCTEx> rx;
  242. rx.SetSize(10,5);
  243. infile.seekg(0,ios::beg);
  244. for(int nn=0;nn<an;nn++)//给数祖赋值
  245. {
  246. infile.read((char*)&m_rx,sizeof(RCV_HISTORY_STRUCTEx));
  247. rx.SetAtGrow(nn,m_rx);
  248. }
  249. infile.close();
  250. //delete infile;//加上这一句,在debug版本中很容易出错
  251. /////////////////////////////////////////////////////
  252. int ppH=0;
  253. int ppL=10000000;
  254. if(an>=m_days && an-m_days-jan>=0)
  255. {
  256. for (int mm=an-m_days-jan;mm<an-jan;mm++)
  257. {
  258. if(ppH<=rx.GetAt(mm).m_fHigh)//rx[mm].m_fHigh)
  259. {
  260. ppH=rx.GetAt(mm).m_fHigh;//rx[mm].m_fHigh;//找到画面周期数的最高价
  261. }
  262. if(ppL>=rx.GetAt(mm).m_fLow)//rx[mm].m_fLow)
  263. {
  264. ppL=rx.GetAt(mm).m_fLow;//rx[mm].m_fLow;//找到画面周期数的最低价
  265. }
  266. }
  267. }
  268. else
  269. {
  270. for (int mm=0;mm<an;mm++)
  271. {
  272. if(ppH<=rx.GetAt(mm).m_fHigh)//rx[mm].m_fHigh)
  273. {
  274. ppH=rx.GetAt(mm).m_fHigh;//rx[mm].m_fHigh;//找到画面周期数的最高价
  275. }
  276. if(ppL>=rx.GetAt(mm).m_fLow)//rx[mm].m_fLow)
  277. {
  278. ppL=rx.GetAt(mm).m_fLow;//rx[mm].m_fLow;//找到画面周期数的最低价
  279. }
  280. }
  281. }
  282. /////////////////////////////////////////////////
  283. if(an>=m_days)
  284. {
  285. int aaa=0;
  286. int bbb=0;
  287. if(an-m_days-jan>=0)
  288. {
  289. aaa=an-jan;
  290. bbb=an-m_days-jan;
  291. }
  292. else
  293. {
  294. aaa=m_days;
  295. bbb=0;
  296. }
  297. for(int i=bbb;i<aaa;i++)
  298. {
  299. KLine2(pDC,rx.GetAt(i)/*rx[i]*/,ppH,ppL,m_pointY[0]);//画K线
  300. }
  301. }
  302. else
  303. {
  304. for(int ii=0;ii<an;ii++)
  305. {
  306. KLine2(pDC,rx.GetAt(ii)/*rx[ii]*/,ppH,ppL,m_pointY[0]);//画K线
  307. }
  308. }
  309. m_x=0;//K线X坐标回0(全局变量)
  310. ReleaseDC(pDC); //Add in
  311. //////////////////////////////////////////////////
  312. //RCV_HISTORY_STRUCTEx m_my_rx=rx.GetAt(mm);
  313. HisLine(1,&rx,5,ppL,ppH,RGB(0,32,255));//画5日均线
  314. HisLine(2,&rx,10,ppL,ppH,RGB(22,171,18));//画10日均线
  315. HisLine(3,&rx,20,ppL,ppH,RGB(255,0,255));//画20日均线
  316. }
  317. void CSingleView::KLine2(CDC* pDC /*mpDC*/,RCV_HISTORY_STRUCTEx m_rx,int H,int L,int Y)
  318. {
  319. // CDC* pDC=mpDC;
  320. //使Y的值改变可以使图放大或缩小
  321. int m=Y;
  322. //pDC->TextOut(50,100,"时间");
  323. //pDC->TextOut(50,200,"开盘");
  324. //pDC->TextOut(50,300,"收盘");
  325. //int nn=0;//计数器,记录此股数据有多少天
  326. //char str[20];
  327. //char str1[20];
  328. //char str2[20];
  329. time_t tt=m_rx.m_time;
  330. int aa=m_rx.m_time;
  331. int cc=m_rx.m_fOpen;
  332. int bb=m_rx.m_fClose;
  333. int ee=m_rx.m_fHigh;
  334. int ff=m_rx.m_fLow;
  335. int eee=ee/10;
  336. int fff=ff/10;
  337. int ccc=cc/10;
  338. int bbb=bb/10;
  339. double gc=H/10-L/10;
  340. double n=(m-20)/gc;//得到单位价格的像素点数
  341. //gcvt(aa,8,str);
  342. //gcvt(bb,8,str1);
  343. //gcvt(cc,8,str2);
  344. //MessageBox(str);//测试时使用
  345. //pDC->TextOut(100,100,str);
  346. //pDC->TextOut(100,200,str1);
  347. //pDC->TextOut(100,300,str2);
  348. if(ccc==bbb)
  349. {
  350. bbb+=1;
  351. }
  352. if(bb>=cc)//收盘价大于开盘价阳线
  353. {
  354. // MessageBox("阳线");
  355. CPen pen(PS_SOLID,1,RGB(255,0,0));
  356. CPen* Oldpen=pDC->SelectObject(&pen);
  357. int m1=m-ccc*n+L/10*n-10;//开
  358. int m2=m-bbb*n+L/10*n-10;//收
  359. int m3=(m-eee*n+L/10*n-10);//高
  360. int m4=(m-fff*n+L/10*n-10);//低
  361. if(m1==m2)
  362. {
  363. // MessageBox("相等");
  364. m2=m1+1;
  365. }
  366. pDC->Rectangle(m_x,m1,m_x+m_KWidth-1,m2);
  367. pDC->MoveTo(m_x+zx,m2);
  368. pDC->LineTo(m_x+zx,m3);//画上影线
  369. pDC->MoveTo(m_x+zx,m1);
  370. pDC->LineTo(m_x+zx,m4);//画下影线
  371. pDC->SelectObject(Oldpen);//恢复系统笔
  372. }
  373. else//阴线
  374. {
  375. CPen pen1(PS_SOLID,1,RGB(0,128,64));
  376. CPen* Oldpen=pDC->SelectObject(&pen1);
  377. CBrush* pbrush;
  378. CBrush brush(RGB(0,128,64));
  379. pbrush=pDC->SelectObject(&brush);
  380. int m1=m-ccc*n+L/10*n-10;//开
  381. int m2=m-bbb*n+L/10*n-10;//收
  382. int m3=(m-eee*n+L/10*n-10);//高
  383. int m4=(m-fff*n+L/10*n-10);//低
  384. if(m1==m2)
  385. {
  386. m2=m1-1;
  387. }
  388. pDC->Rectangle(m_x,m1,m_x+m_KWidth-1,m2);
  389. pDC->FillRect(CRect(m_x,m1,m_x+m_KWidth-1,m2),&brush);//填充实体
  390. pDC->SelectObject(pbrush);
  391. pDC->MoveTo(m_x+zx,m3);
  392. pDC->LineTo(m_x+zx,m4);//一次完成上下影线
  393. pDC->SelectObject(Oldpen);//恢复系统笔
  394. }
  395. m_x +=(m_KWidth+1);//K线移位
  396. //pDC->SelectObject(Oldpen);//恢复系统笔
  397. // ReleaseDC(pDC);
  398. }
  399. void CSingleView::HisLine(int number,CArray<RCV_HISTORY_STRUCTEx,RCV_HISTORY_STRUCTEx>/*RCV_HISTORY_STRUCTEx*/ *rx,int nPj,int ppL,int ppH,COLORREF crColor)
  400. {
  401. CDC* pDC=GetDC();
  402. CPen pen(PS_SOLID,1,crColor);
  403. CPen* oldpen=pDC->SelectObject(&pen);
  404. int pj=0;
  405. int xz=1;
  406. RECT rect;
  407. GetClientRect(&rect);
  408. int mmx=(rect.right/4)*3;
  409. int mx=(mmx-50)/(m_KWidth+1);//得到画面的周期数
  410. //////////////////////////
  411. int* bbbb=new int[an-(nPj-1)];//定义一个均线数组
  412. for(int ii=0;ii<an-(nPj-1);ii++)
  413. {
  414. for(int jj=0;jj<nPj;jj++)
  415. {
  416. pj=pj+rx->GetAt(ii+jj).m_fClose;
  417. }
  418. bbbb[ii]=pj/nPj;//给均线数组赋值
  419. pj=0;
  420. }
  421. double bb=bbbb[an-nPj];
  422. double aaa=bbbb[an-nPj-1];
  423. CString str0;
  424. CString str;
  425. str0.Format("%d",nPj);
  426. str0="ma"+str0;
  427. str0=str0+":";
  428. str.Format("%6.2f",bbbb[an-nPj-1]/1000.00);
  429. pDC->TextOut(number*90,1,str0+str);
  430. double km1=ppH/10-ppL/10;
  431. double km2=(m_pointY[0]-20)/km1;//得到单位价格的像素点数
  432. if(an-mx>=nPj-1 && an-(nPj-1)-mx-jan>=0)//总周期数-画面周期数>=(均线周期-1),从第一个画
  433. {
  434. int amb1=(bbbb[an-(nPj-1)-mx-jan]/10*km2);
  435. int amb2=ppL/10*km2;
  436. int amb0=m_pointY[0]-amb1+amb2-10;
  437. pDC->MoveTo(zx,amb0);
  438. int poi=zx+m_KWidth+1;
  439. for(int kk=0;kk<mx-1;kk++)//因为有moveto一次,所以这里mx-1
  440. {
  441. int a1=(bbbb[an-(nPj-1)-mx+1+kk-jan]/10*km2);
  442. int a2=ppL/10*km2;
  443. int a3=m_pointY[0]-a1+a2-10;
  444. pDC->LineTo(poi,a3);
  445. poi+=(m_KWidth+1);
  446. }
  447. delete bbbb;
  448. }
  449. else if(an-mx>=0 && an-mx<(nPj-1))//从公式算起点
  450. {
  451. int amb1=(bbbb[an-(nPj-1)-mx+(nPj-(an-mx))-jan]/10*km2);//(5-(an-mx))是均线周期-总周期和画面周期的差
  452. int amb2=ppL/10*km2;
  453. int amb0=m_pointY[0]-amb1+amb2-10;
  454. pDC->MoveTo(zx+(m_KWidth+1)*((nPj-1)-(an-mx)-jan),amb0);
  455. int poi=zx+(m_KWidth+1)*((nPj-1)-(an-mx)+1);//4-(an-mx)是均线周期减1再减总周期和画面周期的差
  456. for(int kk=0;kk<mx-((nPj-1)-(an-mx))-1-1-jan;kk++)//mx-4是画面周期数-均线周期数有去掉moveto一次
  457. {
  458. int a1=(bbbb[an-(nPj-1)-mx+(nPj-(an-mx)-jan)+1+kk]/10*km2);
  459. int a2=ppL/10*km2;
  460. int a3=m_pointY[0]-a1+a2-10;
  461. pDC->LineTo(poi+(m_KWidth+1),a3);
  462. poi+=(m_KWidth+1);
  463. }
  464. delete bbbb;
  465. }
  466. else //从第五个开始
  467. {
  468. //jan=0;
  469. int amb1=(bbbb[0]/10*km2);
  470. int amb2=ppL/10*km2;
  471. int amb0=m_pointY[0]-amb1+amb2-10;
  472. pDC->MoveTo(zx+(m_KWidth+1)*(nPj),amb0);//4是均线周期数减1
  473. int poi=zx+(m_KWidth+1)*(nPj-1)+(m_KWidth+1);
  474. for(int kk=0;kk<an-(nPj-1)-jan;kk++)//有去掉moveto一次
  475. {
  476. int a1=(bbbb[kk]/10*km2);
  477. int a2=ppL/10*km2;
  478. int a3=m_pointY[0]-a1+a2-10;
  479. pDC->LineTo(poi,a3);
  480. poi+=(m_KWidth+1);
  481. }
  482. delete bbbb;
  483. }
  484. pDC->SelectObject(oldpen);
  485. ReleaseDC(pDC);
  486. }
  487. void CSingleView::MACD(int L, int S, int V)
  488. {
  489. CDC* pDC=GetDC();
  490. CString s1,s2,s3;
  491. s1.Format("%d",L);
  492. s2.Format("%d",S);
  493. s3.Format("%d",V);
  494. pDC->TextOut(1,m_pointY[1]+1,"MACD("+s1+","+s2+","+s3+")");
  495. RECT rect;
  496. GetClientRect(&rect);
  497. int bj=(rect.right)/4*3;
  498. m_days=(bj-50)/(m_KWidth+1);//画面周期
  499. double pH=-99999999999999.99;
  500. double pL=999999999999999.99;
  501. CMyStockDoc* pDoc=(CMyStockDoc*)GetDocument();
  502. CString filename=".\DAY\"+pDoc->m_FileName;
  503. filename+=".day";
  504. an=0;
  505. double LongV=0.00;//长周期移动平均
  506. double shortV=0.00;//短周期移动平均
  507. ifstream file(filename,ios::binary);
  508. file.seekg(0,ios::end);
  509. int filesize=file.tellg();
  510. an=filesize/sizeof(tagRCV_HISTORY_STRUCTEx);//得到数据天数
  511. tagRCV_HISTORY_STRUCTEx* rx=new tagRCV_HISTORY_STRUCTEx[an];
  512. file.seekg(0,ios::beg);
  513. for(int m=0;m<an;m++)
  514. {
  515. file.read((char*)&rx[m],sizeof(tagRCV_HISTORY_STRUCTEx));
  516. }
  517. file.close;
  518. int m3=rx[an-1].m_fClose;//最后一组有效
  519. time_t t4=rx[an].m_time;//无效
  520. //上面完成读数据
  521. ///////////////////////////////////
  522. //下面给dif赋值:
  523. double* shortv=new double[an];
  524. double sum=0.00;
  525. for(int i=0;i<an;i++)
  526. {
  527. if(i==0) shortv[i]=rx[i].m_fClose;
  528. if(i<S && i>0)
  529. {
  530. for(int m=0;m<i;m++)
  531. {
  532. sum+=rx[i-m].m_fClose;
  533. }
  534. shortv[i]=sum/i;
  535. sum=0.00;
  536. }
  537. if(i>=S)
  538. {
  539. for(int j=0;j<S;j++)
  540. {
  541. sum+=rx[i-j].m_fClose;
  542. }
  543. shortv[i]=sum/S;
  544. sum=0.00;
  545. }
  546. }
  547. double* longv=new double[an];
  548. sum=0.00;
  549. for(int ii=0;ii<an;ii++)
  550. {
  551. if(ii==0) longv[ii]=rx[ii].m_fClose;
  552. if(ii<L && ii>0)
  553. {
  554. for(int m=0;m<ii;m++)
  555. {
  556. sum+=rx[ii-m].m_fClose;
  557. }
  558. longv[ii]=sum/ii;
  559. sum=0.00;
  560. }
  561. if(ii>=L)
  562. {
  563. for(int j=0;j<L;j++)
  564. {
  565. sum+=rx[ii-j].m_fClose;
  566. }
  567. longv[ii]=sum/L;
  568. sum=0.00;
  569. }
  570. }
  571. double* DIF=new double[an];
  572. for(int iii=0;iii<an;iii++)
  573. {
  574. DIF[iii]=shortv[iii]-longv[iii];
  575. }
  576. delete [] shortv;
  577. delete [] longv;
  578. double* MACD=new double[an];
  579. sum=0.00;
  580. for(int iiii=0;iiii<an;iiii++)
  581. {
  582. if(iiii==0) MACD[iiii]=DIF[iiii];
  583. if(iiii<V && iiii>0)
  584. {
  585. for(int m=0;m<iiii;m++)
  586. {
  587. sum+=DIF[iiii];
  588. }
  589. MACD[iiii]=sum/iiii;
  590. sum=0.00;
  591. }
  592. if(iiii>=V)
  593. {
  594. for(int j=0;j<V;j++)
  595. {
  596. sum+=DIF[iiii-j];
  597. }
  598. MACD[iiii]=sum/V;
  599. sum=0.00;
  600. }
  601. }
  602. //MACD赋值完毕 
  603. //验证正确
  604. /////////////////////////////////
  605. if(an>=m_days)
  606. {
  607. for(int di=an-m_days;di<an;di++)
  608. {
  609. if(DIF[di]>=pH) pH=DIF[di];
  610. if(MACD[di]>=pH) pH=MACD[di];
  611. if(DIF[di]<=pL) pL=DIF[di];
  612. if(MACD[di]<=pL) pL=MACD[di];
  613. }
  614. }
  615. if(an<m_days)
  616. {
  617. for(int di=0;di<an;di++)
  618. {
  619. if(DIF[di]>=pH) pH=DIF[di];
  620. if(MACD[di]>=pH) pH=MACD[di];
  621. if(DIF[di]<=pL) pL=DIF[di];
  622. if(MACD[di]<=pL) pL=MACD[di];
  623. }
  624. }
  625. //找出最高和最低
  626. //一下开始画线
  627. int MAC=m_pointY[2]-m_pointY[1];
  628. double bb=(MAC-20)/(pH-pL);//得到单位像素数
  629. int line0=m_pointY[2]+pL*bb;
  630. pDC->MoveTo(0,line0);
  631. pDC->LineTo(bj-50,line0);
  632. int pos=0;
  633. //
  634. if(an>=m_days)
  635. {
  636. ////////////////////////////////1.画DIF
  637. double fff=(DIF[an-m_days]-pL)*bb;
  638. int DIFy1=m_pointY[2]-fff;
  639. CPen pen(PS_SOLID,1,RGB(0,32,255));
  640. CPen* Oldpen=pDC->SelectObject(&pen);
  641. pDC->MoveTo(zx,DIFy1);
  642. pos=zx;
  643. for(int p=an-m_days;p<an;p++)
  644. {
  645. int DIFy=m_pointY[2]-(DIF[p]-pL)*bb;
  646. pDC->LineTo(pos,DIFy);
  647. pos+=(m_KWidth+1);
  648. }
  649. pDC->SelectObject(Oldpen);
  650. pos=zx;
  651. pDC->SetTextColor(RGB(0,32,255));
  652. CString str;
  653. str.Format("%5.3f",DIF[an-1]/100.00);
  654. pDC->TextOut(100,m_pointY[1]+1,"DIF:"+str);
  655. pDC->SetTextColor(RGB(0,0,0));
  656. /////////////////////////////////////2.画MACD
  657. double mf=(MACD[an-m_days]-pL)*bb;
  658. int MACDy1=m_pointY[2]-mf;
  659. CPen pen1(PS_SOLID,1,RGB(22,171,18));
  660. CPen* Oldpen1=pDC->SelectObject(&pen1);
  661. pDC->MoveTo(zx,MACDy1);
  662. for(int p2=an-m_days;p2<an;p2++)
  663. {
  664. int MACDy=m_pointY[2]-(MACD[p2]-pL)*bb;
  665. pDC->LineTo(pos,MACDy);
  666. pos+=(m_KWidth+1);
  667. }
  668. pDC->SelectObject(Oldpen1);
  669. pos=zx;
  670. pDC->SetTextColor(RGB(128,0,128));
  671. CString str1;
  672. str1.Format("%5.3f",MACD[an-1]/100.00);
  673. pDC->TextOut(170,m_pointY[1]+1,"MACD:"+str1);
  674. pDC->SetTextColor(RGB(0,0,0));
  675. ////////////////////////////////////////3.画柱状线
  676. for(int p3=an-m_days;p3<an;p3++)
  677. {
  678. pDC->MoveTo(pos,line0);
  679. int D_M=(DIF[p3]-MACD[p3]);
  680. if(D_M>0)
  681. {
  682. CPen pen2(PS_SOLID,1,RGB(255,0,0));
  683. CPen* Oldpen2=pDC->SelectObject(&pen2);
  684. pDC->LineTo(pos,line0-D_M*bb);
  685. pDC->SelectObject(Oldpen2);
  686. }
  687. if(D_M<=0)
  688. {
  689. CPen pen3(PS_SOLID,1,RGB(0,128,64));
  690. CPen* Oldpen3=pDC->SelectObject(&pen3);
  691. pDC->LineTo(pos,line0-D_M*bb);
  692. pDC->SelectObject(Oldpen3);
  693. }
  694. pos+=(m_KWidth+1);
  695. }
  696. if(DIF[an-1]-MACD[an-1]>=0)
  697. {
  698. pDC->SetTextColor(RGB(255,0,255));
  699. }
  700. else
  701. {
  702. pDC->SetTextColor(RGB(0,180,0));
  703. }
  704. CString str2;
  705. str2.Format("%5.3f",(DIF[an-1]-MACD[an-1])/100.00);
  706. pDC->TextOut(260,m_pointY[1]+1,"DEA:"+str2);
  707. pDC->SetTextColor(RGB(0,0,0));
  708. delete [] DIF;
  709. delete [] MACD;
  710. }
  711. if(an<m_days)
  712. {
  713. double fff=(DIF[0]-pL)*bb;
  714. int DIFy1=m_pointY[2]-fff;
  715. CPen pen(PS_SOLID,1,RGB(0,32,255));
  716. CPen* Oldpen=pDC->SelectObject(&pen);
  717. pDC->MoveTo(zx,DIFy1);
  718. pos=zx;
  719. for(int p=1;p<an;p++)
  720. {
  721. int DIFy=m_pointY[2]-(DIF[p]-pL)*bb;
  722. pDC->LineTo(pos,DIFy);
  723. pos+=(m_KWidth+1);
  724. }
  725. pos=zx;
  726. pDC->SelectObject(Oldpen);
  727. pDC->SetTextColor(RGB(0,32,255));
  728. CString str;
  729. str.Format("%5.3f",DIF[an-1]/100.00);
  730. pDC->TextOut(100,m_pointY[1]+1,"DIF:"+str);
  731. pDC->SetTextColor(RGB(0,0,0));
  732. //////////////
  733. double mf=(MACD[0]-pL)*bb;
  734. int MACDy1=m_pointY[2]-mf;
  735. CPen pen1(PS_SOLID,1,RGB(22,171,18));
  736. CPen* Oldpen1=pDC->SelectObject(&pen1);
  737. pDC->MoveTo(zx,MACDy1);
  738. for(int p2=0;p2<an;p2++)
  739. {
  740. int MACDy=m_pointY[2]-(MACD[p2]-pL)*bb;
  741. pDC->LineTo(pos,MACDy);
  742. pos+=(m_KWidth+1);
  743. }
  744. pDC->SelectObject(Oldpen1);
  745. pos=zx;
  746. pDC->SetTextColor(RGB(128,0,128));
  747. CString str1;
  748. str1.Format("%5.3f",MACD[an-1]/100.00);
  749. pDC->TextOut(170,m_pointY[1]+1,"MACD:"+str1);
  750. pDC->SetTextColor(RGB(0,0,0));
  751. /////////////////////////////////
  752. for(int p3=0;p3<an;p3++)
  753. {
  754. pDC->MoveTo(pos,line0);
  755. int D_M=DIF[p3]-MACD[p3];
  756. if(D_M>0)
  757. {
  758. CPen pen2(PS_SOLID,1,RGB(255,0,0));
  759. CPen* Oldpen2=pDC->SelectObject(&pen2);
  760. pDC->LineTo(pos,line0-D_M*bb);
  761. pDC->SelectObject(Oldpen2);
  762. }
  763. if(D_M<=0)
  764. {
  765. CPen pen3(PS_SOLID,1,RGB(0,128,64));
  766. CPen* Oldpen3=pDC->SelectObject(&pen3);
  767. pDC->LineTo(pos,line0-D_M*bb);
  768. pDC->SelectObject(Oldpen3);
  769. }
  770. pos+=(m_KWidth+1);
  771. }
  772. if(DIF[an-1]-MACD[an-1]>=0)
  773. {
  774. pDC->SetTextColor(RGB(255,0,255));
  775. }
  776. else
  777. {
  778. pDC->SetTextColor(RGB(0,180,0));
  779. }
  780. CString str2;
  781. str2.Format("%5.3f",(DIF[an-1]-MACD[an-1])/100.00);
  782. pDC->TextOut(260,m_pointY[1]+1,"DEA:"+str2);
  783. pDC->SetTextColor(RGB(0,0,0));
  784. delete [] DIF;
  785. delete [] MACD;
  786. ReleaseDC(pDC);
  787. }
  788. }
  789. void CSingleView::KDJ(int n)
  790. {
  791. CDC* pDC=GetDC();
  792. RECT rect;
  793. GetClientRect(&rect);
  794. //CBrush myBrush(RGB(255,255,255));
  795. //pDC->FillRect(&rect,&myBrush);
  796. int pos=0;//X轴增量
  797. CString s1;
  798. s1.Format("%d",n);
  799. pDC->TextOut(1,m_pointY[0]+1,"KDJ("+s1+")");
  800. m_days=((rect.right)/4*3-50)/(m_KWidth+1);//画面周期
  801. int pH=0;
  802. int pL=99999999;
  803. int Close=0;
  804. CMyStockDoc* pDoc=(CMyStockDoc*)GetDocument();
  805. CString str=".\DAY\"+pDoc->m_FileName;
  806. str+=".day";
  807. ifstream kdjfile(str,ios::binary);
  808. kdjfile.seekg(0,ios::end);
  809. int fsize=kdjfile.tellg();
  810. an=fsize/sizeof(RCV_HISTORY_STRUCTEx);//得到总日期数
  811. int pk=0;
  812. RCV_HISTORY_STRUCTEx* rx=new RCV_HISTORY_STRUCTEx[an];//定义一个数组
  813. kdjfile.seekg(0,ios::beg);//设置到文件头
  814. for(int a=0;a<an;a++)
  815. {
  816. kdjfile.read((char*)/*mrx*/&rx[a],sizeof(RCV_HISTORY_STRUCTEx));
  817. }
  818. kdjfile.close();//关闭文件不要再使用delete kdjfile;
  819. //读数据到数组(经检查正确)
  820. //最后一个有效元素是下标为an-1的元素
  821. //下标为an的元素无效
  822. /////////////////////////////////////////
  823. //下面这段是数据验证代码:
  824. time_t time0=rx[0].m_time;
  825. int aaaa0=rx[0].m_fClose;
  826. time_t time1=rx[1].m_time;
  827. int aaaa1=rx[1].m_fClose;
  828. int aaaaan=rx[an-1].m_fClose;//最后一个有效元素是下标为an-1的元素
  829. time_t timean1=rx[an].m_time;
  830. int aaaaan1=rx[an].m_fClose;//下标为an的元素无效
  831. //数据验证代码结束
  832. ////////////////////////////////////////
  833. MYKDJ* kdjarray=new MYKDJ[an];// 定义一个kdj天数的数组,n是kdj的周期
  834. ////////////////////////////////
  835. //开始为kdj数组赋值:
  836. kdjarray[0].k=50.00;
  837. kdjarray[0].d=50.00;
  838. kdjarray[0].j=50.00;
  839. for(int ii=1;ii<an;ii++)
  840. {
  841. if(ii>0 && ii<n)//n是参数
  842. {
  843. for(int k=0;k<=ii;k++)
  844. {
  845. if(rx[ii-k].m_fClose>=pH)
  846. {
  847. pH=rx[ii-k].m_fClose;//找到最高和最低
  848. }
  849. if(rx[ii-k].m_fClose<=pL)
  850. {
  851. pL=rx[ii-k].m_fClose;
  852. }
  853. Close=rx[ii].m_fClose;  
  854. }
  855. pk=(Close-pL)/(pH-pL)*100.00;//计算kdj  AAA
  856. kdjarray[ii].k=kdjarray[ii-1].k*2/3+pk/3;
  857. kdjarray[ii].d=kdjarray[ii-1].d*2/3+kdjarray[ii].k/3;
  858. kdjarray[ii].j=kdjarray[ii].k*3-kdjarray[ii].d*2;
  859. pH=1;
  860. pL=99999999;
  861. }
  862. //////////////////////////////////////
  863. if(ii>=n)
  864. {
  865. for(int jj=0;jj<n;jj++)
  866. {
  867. if(rx[ii-jj].m_fClose>=pH)
  868. {
  869. pH=rx[ii-jj].m_fClose;
  870. }
  871. if(rx[ii-jj].m_fClose<=pL)
  872. {
  873. pL=rx[ii-jj].m_fClose;
  874. }
  875. }
  876. Close=rx[ii].m_fClose;
  877. int pp=Close-pL;//
  878. double kk=pH-pL;//
  879. if(kk==0.000000000000000000)
  880. {
  881. kk=0.000000009;
  882. }
  883. pk=pp/kk*100.00;// 这3行等效于AAA处,但如果同样写法会出现C1001编译器错误。
  884. pH=0;
  885. pL=99999999;
  886. kdjarray[ii].k=kdjarray[ii-1].k*2/3+pk/3;
  887. kdjarray[ii].d=kdjarray[ii-1].d*2/3+kdjarray[ii].k/3;
  888. kdjarray[ii].j=kdjarray[ii].k*3-kdjarray[ii].d*2;
  889. }
  890. }// 完成为kdj数组赋值
  891. delete [] rx;//删除数组
  892. //////////////////////////////////////
  893. //以下开始画线
  894. int kdj=m_pointY[1]-m_pointY[0]-20;
  895. double bb=kdj/120.00;
  896. //char kkdj[10];
  897. //gcvt(an,8,kkdj);
  898. //pDC->TextOut(100,m_pointY[0]+20,"总天数");
  899. //pDC->TextOut(150,m_pointY[0]+20,kkdj);
  900. //gcvt(am,8,kkdj);
  901. //pDC->TextOut(100,m_pointY[0]+60,kkdj);
  902. ////////////
  903. //分两种情况:
  904. //第一种:
  905. if(an>=m_days)
  906. {
  907. /////////////////////////k
  908. double k1=kdjarray[an-m_days].k;
  909. int ky=m_pointY[0]+20+bb*10+(100-k1)*bb;
  910. CPen pen(PS_SOLID,1,m_Line1Color);
  911. CPen* Oldpen=pDC->SelectObject(&pen);
  912. pDC->MoveTo(zx,ky);
  913. pos=zx;
  914. for(int km=an-m_days;km<an;km++)
  915. {
  916. double k=kdjarray[km].k;
  917. CString myk;
  918. myk.Format("%5.2f",k/1.00);
  919. myk="K: "+myk;
  920. pDC->SetTextColor(m_Line1Color);
  921. pDC->TextOut(60,m_pointY[0]+1,myk);
  922. int ky2=m_pointY[0]+20+bb*10+(100-k)*bb;
  923. pDC->LineTo(pos,ky2);
  924. pDC->SetTextColor(RGB(0,0,0));
  925. pos+=(m_KWidth+1);
  926. }
  927. pos=zx;
  928. pDC->SelectObject(Oldpen);
  929. //////////////////////////d
  930. CPen pend(PS_SOLID,1,RGB(22,171,18));
  931. CPen* Oldpend=pDC->SelectObject(&pend);
  932. double d1=kdjarray[an-m_days].d;
  933. int dy=m_pointY[0]+20+bb*10+(100-d1)*bb;
  934. pDC->MoveTo(zx,dy);
  935. for(int dm=an-m_days;dm<an;dm++)
  936. {
  937. double d=kdjarray[dm].d;
  938. CString myd;
  939. myd.Format("%5.2f",d/1.00);
  940. myd="D: "+myd;
  941. pDC->SetTextColor(RGB(22,171,18));
  942. pDC->TextOut(140,m_pointY[0]+1,myd);
  943. int dy2=m_pointY[0]+20+bb*10+(100-d)*bb;
  944. pDC->LineTo(pos,dy2);
  945. pDC->SetTextColor(RGB(0,0,0));
  946. pos+=(m_KWidth+1);
  947. }
  948. pDC->SelectObject(Oldpend);
  949. pos=zx;
  950. ///////////////////j
  951. CPen penj(PS_SOLID,1,RGB(255,0,255));
  952. CPen* Oldpenj=pDC->SelectObject(&penj);
  953. double j1=kdjarray[an-m_days].j;
  954. int jy=m_pointY[0]+20+bb*10+(100-j1)*bb;
  955. pDC->MoveTo(zx,jy);
  956. for(int jm=an-m_days;jm<an;jm++)
  957. {
  958. double j=kdjarray[jm].j;
  959. int jy2=m_pointY[0]+20+bb*10+(100-j)*bb;
  960. CString myj;
  961. myj.Format("%5.2f",j/1.00);
  962. myj="J: "+myj;
  963. pDC->SetTextColor(RGB(255,0,255));
  964. pDC->TextOut(210,m_pointY[0]+1,myj);
  965. pDC->SetTextColor(RGB(0,0,0));
  966. if(jy2<m_pointY[0]+20)
  967. {
  968. jy2=m_pointY[0]+20;
  969. }
  970. if(jy2>m_pointY[1])
  971. {
  972. jy2=m_pointY[1]-1;
  973. }
  974. pDC->LineTo(pos,jy2);
  975. pos+=(m_KWidth+1);
  976. }
  977. pDC->SelectObject(Oldpenj);
  978. pos=zx;
  979. delete [] kdjarray;//删除数组
  980. }
  981. ///第二种:
  982. else
  983. {
  984. int pos=zx;
  985. /////////////////////////k
  986. CPen penk(PS_SOLID,1,RGB(0,32,255));
  987. CPen* Oldpenk=pDC->SelectObject(&penk);
  988. int k1=kdjarray[0].k;
  989. int py=m_pointY[0]+20+bb*10+(100-k1)*bb;
  990. pDC->MoveTo(zx,py);
  991. for(int mm=0;mm<an;mm++)
  992. {
  993. double k=kdjarray[mm].k;
  994. CString myk;
  995. myk.Format("%5.2f",k);
  996. myk="K: "+myk;
  997. pDC->SetTextColor(RGB(0,32,255));
  998. pDC->TextOut(80,m_pointY[0]+1,myk);
  999. pDC->SetTextColor(RGB(0,0,0));
  1000. int kx=m_pointY[0]+20+bb*10+(100-k)*bb;
  1001. pDC->LineTo(pos,kx);
  1002. pos+=(m_KWidth+1);
  1003. }
  1004. pos=zx;
  1005. pDC->SelectObject(Oldpenk);
  1006. //////////////////////////////
  1007. CPen pend(PS_SOLID,1,RGB(22,171,18));
  1008. CPen* Oldpend=pDC->SelectObject(&pend);
  1009. int d1=kdjarray[0].d;
  1010. int dy=m_pointY[0]+20+bb*10+(100-d1)*bb;
  1011. pDC->MoveTo(zx,dy);
  1012. for(int dm=0;dm<an;dm++)
  1013. {
  1014. double d=kdjarray[dm].d;
  1015. CString myd;
  1016. myd.Format("%5.2f",d);
  1017. myd="D: "+myd;
  1018. pDC->SetTextColor(RGB(22,171,18));
  1019. pDC->TextOut(140,m_pointY[0]+1,myd);
  1020. pDC->SetTextColor(RGB(0,0,0));
  1021. int dy2=m_pointY[0]+20+bb*10+(100-d)*bb;
  1022. pDC->LineTo(pos,dy2);
  1023. pos+=(m_KWidth+1);
  1024. }
  1025. pDC->SelectObject(Oldpend);
  1026. pos=zx;
  1027. ///////////////////j
  1028. CPen penj(PS_SOLID,1,RGB(255,0,255));
  1029. CPen* Oldpenj=pDC->SelectObject(&penj);
  1030. int j1=kdjarray[0].j;
  1031. int jy=m_pointY[0]+20+bb*10+(100-j1)*bb;
  1032. pDC->MoveTo(zx,jy);
  1033. for(int jm=0;jm<an;jm++)
  1034. {
  1035. double j=kdjarray[jm].j;
  1036. int jy2=m_pointY[0]+20+bb*10+(100-j)*bb;
  1037. CString myj;
  1038. myj.Format("%5.2f",j);
  1039. myj="J: "+myj;
  1040. pDC->SetTextColor(RGB(255,0,255));
  1041. pDC->TextOut(200,m_pointY[0]+1,myj);
  1042. pDC->SetTextColor(RGB(255,0,255));
  1043. if(jy2<m_pointY[0]+20)
  1044. {
  1045. jy2=m_pointY[0]+20;
  1046. }
  1047. if(jy2>m_pointY[1])
  1048. {
  1049. jy2=m_pointY[1]-1;
  1050. }
  1051. pDC->LineTo(pos,jy2);
  1052. pos+=(m_KWidth+1);
  1053. }
  1054. pDC->SelectObject(Oldpenj);
  1055. pos=zx;
  1056. delete [] kdjarray;//删除数组
  1057. }
  1058. }
  1059. void CSingleView::OnMouseMove(UINT nFlags, CPoint point) 
  1060. {
  1061. RECT rect;
  1062. GetClientRect(&rect);
  1063. int bj=rect.right/4*3;
  1064. CDC* pDC=GetDC();
  1065. if(point.x>=bj-50)
  1066. {
  1067. ::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));//设置光标
  1068. }
  1069. if(pp !=1)
  1070. {
  1071. for(i=0; i<m_paintnum-1;i++)//底线不选,即底线不能移动
  1072. {
  1073. if(point.y>m_pointY[i]-2 && point.y<m_pointY[i]+2 && point.x<=bj)
  1074. {
  1075. ::SetCursor(AfxGetApp()->LoadCursor(IDC_MOVE));
  1076. pPointY[i]=1;
  1077. break;//一旦选到就跳出,使i不再改变,保证下标正确
  1078. }
  1079. }
  1080. }
  1081. if(pp==1 && pPointY[i]==1)
  1082. {
  1083. CRect rectOld(0,m_ptOld.y,bj,m_ptOld.y+1);
  1084. pDC->InvertRect(&rectOld);
  1085. CRect rectNew(0,point.y,bj,point.y+1);
  1086. pDC->InvertRect(&rectNew);
  1087. m_ptOld=point;
  1088. }
  1089. ReleaseDC(pDC);
  1090. CView::OnMouseMove(nFlags, point);
  1091. }
  1092. void CSingleView::OnLButtonDown(UINT nFlags, CPoint point) 
  1093. {
  1094. pp=1;
  1095. m_ptStart=point;
  1096. m_ptOld=point;
  1097. CView::OnLButtonDown(nFlags, point);
  1098. }
  1099. void CSingleView::OnLButtonUp(UINT nFlags, CPoint point) 
  1100. {
  1101. RECT rect;
  1102. GetClientRect(&rect);
  1103. int bj=(rect.right/4)*3;
  1104. if(pp==1 && pPointY[i]==1)
  1105. {
  1106. int a=point.y;
  1107. int b=m_pointY[i+1]-20;
  1108. int c=m_pointY[i-1]+20;
  1109. if(a<b && a>c)
  1110. {
  1111. m_pointY[i]=point.y;
  1112. }
  1113. if(a<c)
  1114. {
  1115. m_pointY[i]=c+2;
  1116. }
  1117. if(a>b)
  1118. {
  1119. m_pointY[i]=b-2;
  1120. }
  1121. }
  1122. if(pp==1 && pPointY[i]==1)
  1123. {
  1124. pp=2;
  1125. pPointY[i]=0;
  1126. Invalidate();
  1127. }
  1128. //pp=2;
  1129. //pPointY[i]=0;
  1130. //Invalidate();
  1131. CView::OnLButtonUp(nFlags, point);
  1132. }
  1133. void CSingleView::OnKline() 
  1134. {
  1135. ((CMyStockApp*)AfxGetApp())->m_bIsKLine=!(((CMyStockApp*)AfxGetApp())->m_bIsKLine);
  1136. RedrawWindow();
  1137. }