FX.C
上传用户:bjghjy
上传日期:2007-01-07
资源大小:379k
文件大小:61k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #include <io.h>
  9. #include <commdlg.h>
  10. #include "resource.h"
  11. #include "global.h"
  12. #include "appmain.h"
  13. #include "fx.h"
  14. #include "hq.h"
  15. #include "hq_cl.h"
  16. #include "hq_tcp.h"
  17. #include "jy_cl.h"
  18. #include "toolbar.h"
  19. #include "msg.h"
  20. void FxFreeData(LPFX);
  21. int InitObjectOne(void);
  22. int InitObjectTwo(void);
  23. int LoadData(FX* fx);
  24. BOOL CreateHistoryData(int arnge,char *gpdm); 
  25. int FxExit(FX *fx);
  26. int CreateMacdData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  27. int CreateRsiData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  28. int CreateDmiData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  29. int CreatePsyData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  30. int CreateVrData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  31. int CreateObvData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  32. int CreateBiasData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  33. int CreateWrData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  34. int CreateKdjData(K_DATA *Main,int RNum,DATA *Data,PARA *Para);
  35. int SetColor(HWND hwnd);
  36. CHOOSECOLOR cc;
  37. extern char szDataPath[128];
  38. extern HWND hWndInput,ghWndHelp;
  39. extern BOOL IsZsRec(int, int);
  40. extern int UDP_Send_DataDay(int, int);
  41. extern int DlgJy(void);
  42. extern JY_ANS_CHKUSR curChkUsrRes;
  43. extern int LoadFile(char *filename,int sline,char *title);
  44. extern HFONT ghFontSmall;
  45. HWND ghWndSetup=NULL;
  46. FX *Fx;
  47. char *RANGE_NAME[]={"5分钟","15分钟","30分钟","60分钟","日","周","月"};
  48. unsigned int RANGE_MENU[7]={IDM_FX_5,IDM_FX_15,IDM_FX_30,IDM_FX_60,IDM_FX_DAY,IDM_FX_WEEK,IDM_FX_MONTH};
  49. char *DIAGR_NAME=NULL;
  50. ANALYSER_INIT_TABLE *INIT_TABLE;
  51. #define WIN_GAP 8
  52. PARA *FindOpPara()
  53. {
  54. PARA *para;
  55. para =&Fx->KxPara;
  56. do
  57. {
  58. if(para->no ==Fx->PaintPara.object)
  59. return para;
  60. para =para->next;
  61. }while(para!=NULL);
  62. return NULL;
  63. }
  64. DATA *FindOpData()
  65. {
  66. DATA *data;
  67. data =&Fx->KxData;
  68. do
  69. {
  70. if(data->no ==Fx->PaintPara.object)
  71. return data;
  72. data =data->next;
  73. }while(data!=NULL);
  74. return NULL;
  75. }
  76. // frome 0 to 9
  77. int GetNo(PARA *para,long feature)
  78. {
  79. int i;
  80. if(para==NULL)
  81. return -1;
  82. if(feature&DW_NAME)
  83. return((int)GetSerial(feature));
  84. for(i=0;i<10;i++)
  85. {
  86. if(feature>>i&1L)
  87. return i;
  88. }
  89. return -1;
  90. }
  91. void GetDiagramName(PARA *Para,int range,char *gpmc)
  92. {
  93. PARA *para;
  94. para =Para;
  95. strcpy(DIAGR_NAME,RANGE_NAME[range]);
  96. do
  97. {
  98. if(para->rc.right >para->rc.left&&
  99. para->rc.bottom >para->rc.top)
  100. {
  101. if(strlen(DIAGR_NAME)>strlen(RANGE_NAME[range]))
  102. strcat(DIAGR_NAME,"-");
  103. strcat(DIAGR_NAME,para->name);
  104. }
  105. para =para->next;
  106. }while(para!=NULL);
  107. strcat(DIAGR_NAME,"-");
  108. strcat(DIAGR_NAME,gpmc);
  109. }
  110. void MakeWinSpace()
  111. {
  112. int i=0,height,vert;
  113. PARA *para;
  114. height =Fx->PaintPara.rc.bottom -Fx->PaintPara.rc.top;
  115. para =&Fx->KxPara;
  116. do
  117. {
  118. if(para->feature&DW_BASE)
  119. i++;
  120. else 
  121. memset(&para->rc,0,sizeof(RECT));
  122. para=para->next;
  123. }while(para!=NULL);
  124. if(i<=0)
  125. {   
  126. memcpy(&Fx->KxPara.rc,&Fx->PaintPara.rc,sizeof(RECT));
  127. Fx->PaintPara.object=1;
  128. return;
  129. }
  130. switch(i)
  131. {
  132. case 1: 
  133. para =&Fx->KxPara;
  134. do
  135. {   
  136. if(para->feature&DW_BASE)
  137. break;
  138. para=para->next;
  139. }while(para!=NULL);
  140. memcpy(&para->rc,&Fx->PaintPara.rc,sizeof(RECT));
  141. Fx->PaintPara.object=para->no;
  142. break;
  143. case 2:
  144. if(Fx->KxPara.feature&DW_BASE)
  145. {
  146. memcpy(&Fx->KxPara.rc,&Fx->PaintPara.rc,sizeof(RECT));
  147. Fx->KxPara.rc.bottom =(height -WIN_GAP)*2/3+Fx->KxPara.rc.top;
  148. vert =Fx->KxPara.rc.bottom+WIN_GAP;
  149. para=Fx->KxPara.next;
  150. do
  151. {   
  152. if(para->feature&DW_BASE)
  153. break;
  154. para=para->next;
  155. }while(para!=NULL);
  156. memcpy(&para->rc,&Fx->PaintPara.rc,sizeof(RECT));
  157. Fx->PaintPara.object=para->no;
  158. para->rc.top =vert;
  159. }
  160. else
  161. {
  162. para=Fx->KxPara.next;
  163. vert =Fx->PaintPara.rc.top;
  164. do
  165. {   
  166. if(para->feature&DW_BASE)
  167. {
  168. memcpy(&para->rc,&Fx->PaintPara.rc,sizeof(RECT));
  169. para->rc.top =vert;
  170. para->rc.bottom =(height -WIN_GAP)/2 +vert;
  171. vert =para->rc.bottom+WIN_GAP;
  172. Fx->PaintPara.object=para->no;
  173. }
  174. para=para->next;
  175. }while(para!=NULL);
  176. }
  177. break;
  178. case 3:
  179. if(Fx->KxPara.feature&DW_BASE&&Fx->CjlPara.feature&DW_BASE)
  180. {
  181. memcpy(&Fx->KxPara.rc,&Fx->PaintPara.rc,sizeof(RECT));
  182. Fx->KxPara.rc.bottom =(height -2*WIN_GAP)*3/6 +Fx->KxPara.rc.top;
  183. Fx->PaintPara.object=1;
  184. vert =Fx->KxPara.rc.bottom +WIN_GAP;
  185. memcpy(&Fx->CjlPara.rc,&Fx->PaintPara.rc,sizeof(RECT));
  186. Fx->CjlPara.rc.top =vert;
  187. Fx->CjlPara.rc.bottom =(height -2*WIN_GAP)*1/6 +vert;
  188. vert =Fx->CjlPara.rc.bottom+WIN_GAP;
  189. para=Fx->CjlPara.next;
  190. do
  191. {   
  192. if(para->feature&DW_BASE)
  193. break;
  194. para=para->next;
  195. }while(para!=NULL);
  196. memcpy(&para->rc,&Fx->PaintPara.rc,sizeof(RECT));
  197. para->rc.top =vert;
  198. break;
  199. }
  200. default:
  201. para=Fx->KxPara.next;
  202. vert =Fx->PaintPara.rc.top;
  203. do
  204. {   
  205. if(para->feature&DW_BASE)
  206. {
  207. memcpy(&para->rc,&Fx->PaintPara.rc,sizeof(RECT));
  208. para->rc.top =vert;
  209. para->rc.bottom =(height -WIN_GAP*(i-1))/i +vert;
  210. vert =para->rc.bottom+WIN_GAP;
  211. Fx->PaintPara.object=para->no;
  212. }
  213. para=para->next;
  214. }while(para!=NULL);
  215. break;
  216. }
  217. }
  218. BOOL RegisterFx(void)
  219. {
  220. WNDCLASS wc;
  221. memset(&wc, 0, sizeof(wc));
  222. wc.lpfnWndProc =FxWndProc;
  223. wc.lpszClassName =FX_CLASS;
  224. wc.hbrBackground =GetStockObject(BLACK_BRUSH);
  225. wc.hInstance = ghInstance;
  226. wc.hCursor = LoadCursor(NULL, IDC_ARROW);        
  227. if(!RegisterClass(&wc)) return FALSE;
  228. return TRUE;
  229. }
  230. BOOL AnalyseInit(void)
  231. {
  232. LOGFONT lf;
  233. char temp[80];
  234. ANALYSER_INIT_TABLE InitTable[]={
  235. {IDM_FX_MACD,"MACD",CreateMacdData},
  236. {IDM_FX_DMI,"DMI",CreateDmiData},
  237. {IDM_FX_BIAS,"BIAS",CreateBiasData},
  238. {IDM_FX_RSI,"RSI",CreateRsiData},
  239. {IDM_FX_PSY,"PSY",CreatePsyData},
  240. {IDM_FX_VR,"VR",CreateVrData},
  241. {IDM_FX_OBV,"OBV",CreateObvData},
  242. {IDM_FX_WR,"WR",CreateWrData},
  243. {IDM_FX_KDJ,"KDJ",CreateKdjData}};
  244.     //init object 0
  245. if(Fx==NULL)
  246.        Fx=(FX*)_fmalloc(sizeof(FX));
  247. if(Fx==NULL)
  248. return FALSE;
  249. memset(Fx,0,sizeof(FX));
  250. Fx->type=IDM_FX_MACD;
  251. if(GetInitString("FX", "RANGE", temp))
  252. Fx->range=atoi(temp);
  253. else
  254. Fx->range=MIN_5;
  255. //init object 1
  256. strcpy(Fx->KxPara.name,"K线");
  257.     Fx->KxPara.no =1;
  258. GetAnalysePara(&Fx->KxPara);
  259. Fx->KxPara.feature |=DW_ALL;
  260. //init object 2
  261.     strcpy(Fx->CjlPara.name,"成交量");
  262.     Fx->CjlPara.no =2;
  263. GetAnalysePara(&Fx->CjlPara);
  264. Fx->CjlPara.feature |=(DW_ALL);
  265. Fx->KxPara.next =&Fx->CjlPara;
  266. Fx->KxData.next =&Fx->CjlData;
  267. //init para object 3
  268. if(Fx->Para==NULL)
  269.            Fx->Para=(PARA*)_fmalloc(sizeof(PARA));
  270.     if(Fx->Para ==NULL)
  271.      return FALSE;
  272.     memset(Fx->Para,0,sizeof(PARA));
  273. Fx->Para->no=3;
  274. Fx->CjlPara.next =Fx->Para;
  275. Fx->Para->feature |=DW_ALL|1L;
  276. //init data object 3
  277. if(Fx->Data==NULL)
  278. Fx->Data=(DATA*)_fmalloc(sizeof(DATA));
  279. if(Fx->Data==NULL)
  280. return FALSE;
  281. memset(Fx->Data,0,sizeof(DATA));
  282. Fx->Data->no=Fx->Para->no;
  283. Fx->CjlData.next =Fx->Data;
  284. //init selected object to object one
  285. Fx->PaintPara.object =1;
  286. Fx->PaintPara.item =DW_NULL;
  287.     //init paint font
  288.     if(Fx->PaintPara.hFont!=NULL)
  289.       DeleteObject(Fx->PaintPara.hFont);
  290. memset(&lf, 0, sizeof(lf));
  291. lf.lfHeight =13;
  292. lf.lfWeight =FW_NORMAL;
  293.     strcpy(lf.lfFaceName,"宋体");
  294. lf.lfItalic=0;
  295. lf.lfUnderline=0;    
  296. Fx->PaintPara.hFont =CreateFontIndirect(&lf);
  297.             
  298.     if(Fx->PaintPara.hFont ==0)
  299.      return FALSE;
  300.     
  301.     DIAGR_NAME =_fmalloc(sizeof(char)*60);
  302.     if(DIAGR_NAME==NULL)
  303.      return FALSE;
  304.     memset(DIAGR_NAME,0,sizeof(char)*60);
  305.     
  306. INIT_TABLE =_fmalloc(sizeof(InitTable));
  307. if(INIT_TABLE ==NULL)
  308. return FALSE;
  309. memcpy(INIT_TABLE,InitTable,sizeof(InitTable));
  310. Fx->PaintPara.num =sizeof(InitTable)/sizeof(ANALYSER_INIT_TABLE);
  311.     return TRUE;
  312. }
  313. BOOL CreateWndFx(HWND hWnd)
  314. {                          
  315. int x, y;
  316. HWND hwnd;
  317. RECT rc;
  318. GetClientRect(ghWndMain, &rc);
  319. x =rc.right -rc.left;
  320. y =rc.bottom -rc.top;
  321. if(ghWndFx==NULL)
  322. {
  323. hwnd =CreateWindow(FX_CLASS, NULL, WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,
  324. 10, 
  325. STATUS_HEIGHT+TOOLBAR_HEIGHT, 
  326. x -20,
  327. (y-STATUS_HEIGHT)-20-TOOLBAR_HEIGHT -GetSystemMetrics(SM_CYCAPTION),
  328. hWnd, NULL, ghInstance, NULL);
  329. if(hwnd ==NULL) return FALSE;
  330. ghWndFx =hwnd;
  331. }
  332. else
  333. {
  334. SetWindowPos(ghWndFx, (HWND) NULL, 
  335. 10, 
  336. STATUS_HEIGHT+TOOLBAR_HEIGHT, 
  337. x -20,
  338. (y-STATUS_HEIGHT)-20-TOOLBAR_HEIGHT -GetSystemMetrics(SM_CYCAPTION),
  339. NULL);
  340. }
  341. return TRUE;
  342. }
  343. int WriteDefaultPara(void)
  344. {
  345. OFSTRUCT os;
  346. HFILE hf;
  347. char fname[80];
  348. PARA para;
  349. sprintf(fname,"%s\sysset.dat",szDataPath);
  350. if((hf =OpenFile(fname,&os,OF_WRITE|OF_CREATE))==HFILE_ERROR)
  351. return -1;
  352.     
  353.     memset(&para,0,sizeof(PARA));
  354.     strcpy(para.name ,"K线");
  355.     para.pnum =3;
  356.     para.dnum =7;                       //ks,ss,zg,zd,pma1,pma2,pma3
  357. strcpy(para.pname[4],"PMA");
  358. strcpy(para.pname[5],"PMA");
  359. strcpy(para.pname[6],"PMA");
  360.     para.color[0] =RGB(255,0,255); para.color[10+0] =RGB(0,255,255);      //K diagram down color
  361.     para.color[4] =RGB(255,100,255);    //K 5 minute average color
  362.     para.color[5] =RGB(255,255,100);    //K 10 minute avrage color
  363. para.color[6] =RGB(100,100,255);    //K 20 ...                                    
  364.     para.periods[4]=5;                  //K 5 minute avrage period
  365.     para.periods[5]=10;                 //K 10...
  366.     para.periods[6]=20;                 //k 20...
  367.     _lwrite(hf,&para,sizeof(PARA));
  368. memset(&para,0,sizeof(PARA));
  369.     strcpy(para.name ,"成交量");
  370.     para.pnum =2;
  371.     para.dnum =4;                       //cj,ks-ss,pma1,pma2
  372. strcpy(para.pname[2],"PMA");
  373. strcpy(para.pname[3],"PMA");
  374.     para.color[0] =RGB(255,0,255);  para.color[10+0] =RGB(0,255,255); 
  375.     para.color[2] =RGB(255,0,255);      //Volumn average diagram color
  376.     para.color[3] =RGB(255,255,0);
  377.     para.periods[2]=5;
  378.     para.periods[3]=10;
  379.     _lwrite(hf,&para,sizeof(PARA));
  380.     
  381. memset(&para,0,sizeof(PARA));
  382.     strcpy(para.name ,"MACD");
  383.     para.pnum =3;
  384.     para.dnum =3;                       //macd,dif,cha
  385. strcpy(para.pname[0],"Macd");
  386. strcpy(para.pname[1],"Dif");
  387. strcpy(para.pname[2],"Dea");
  388.     para.color[0] =RGB(255,255,100);
  389.     para.color[1] =RGB(255,255,255); 
  390.     para.color[2] =RGB(255,0,255); para.color[10+2] =RGB(0,255,255);
  391.     para.periods[0]=12;
  392.     para.periods[1]=26;
  393.     para.periods[2]=9; 
  394.     _lwrite(hf,&para,sizeof(PARA));
  395. memset(&para,0,sizeof(PARA));    
  396.     strcpy(para.name,"RSI");
  397.     para.pnum =2;
  398.     para.dnum =2;                       //1Rsi,2Rsi
  399. strcpy(para.pname[0],"Rsi");
  400. strcpy(para.pname[1],"Rsi");
  401.     para.color[0] =RGB(255,255,255); 
  402.     para.color[1] =RGB(255,255,100);    
  403.     para.periods[0]=6;
  404.     para.periods[1]=12;
  405.     _lwrite(hf,&para,sizeof(PARA));
  406.     
  407. memset(&para,0,sizeof(PARA));    
  408.     strcpy(para.name,"DMI");    
  409.     para.pnum =1;
  410.     para.dnum =3;
  411. strcpy(para.pname[0],"+Di");
  412. strcpy(para.pname[1],"-Di");
  413. strcpy(para.pname[2],"+Adx");
  414. para.color[0]=RGB(255,255,255);  //up di color
  415.     para.color[1]=RGB(255,255,100);  //down di...
  416.     para.color[2]=RGB(100,255,255);  //adx...
  417.     //para.color[3]=RGB(100,100,255); 
  418.     para.periods[0]=14;
  419.     _lwrite(hf,&para,sizeof(PARA));
  420.     
  421. memset(&para,0,sizeof(PARA));
  422.     strcpy(para.name,"PSY");
  423.     para.pnum =1;
  424.     para.dnum =1;
  425. strcpy(para.pname[0],"Psy");
  426. para.color[0]=RGB(255,255,100);  //
  427.     para.periods[0]=12;
  428.     _lwrite(hf,&para,sizeof(PARA));
  429.             
  430. memset(&para,0,sizeof(PARA));            
  431.     strcpy(para.name,"VR");
  432.     para.pnum =1;
  433.     para.dnum =1;    
  434. strcpy(para.pname[0],"Vr");
  435. para.color[0]=RGB(255,255,100);  //
  436.     para.periods[0]=26;
  437.     _lwrite(hf,&para,sizeof(PARA));
  438.     
  439. memset(&para,0,sizeof(PARA));    
  440.     strcpy(para.name,"OBV");
  441.     para.pnum =1;
  442.     para.dnum =1;    
  443. strcpy(para.pname[0],"Obv");    
  444. para.color[0]=RGB(255,255,100);
  445.     para.periods[0]=5;
  446.     _lwrite(hf,&para,sizeof(PARA));
  447.     
  448. memset(&para,0,sizeof(PARA));    
  449.     strcpy(para.name,"BIAS");
  450.     para.pnum =1;
  451.     para.dnum =1;    
  452. strcpy(para.pname[0],"Bias");
  453. para.color[0]=RGB(255,255,100),  //
  454.     para.periods[0]=10;
  455.     _lwrite(hf,&para,sizeof(PARA));
  456.     
  457. memset(&para,0,sizeof(PARA));    
  458.     strcpy(para.name,"WR");    
  459.     para.pnum =3;
  460.     para.dnum =3;    
  461. strcpy(para.pname[0],"Wr");
  462. strcpy(para.pname[1],"Wr");
  463. strcpy(para.pname[2],"Wr");
  464. para.color[0]=RGB(255,255,255);  //
  465. para.color[1]=RGB(255,255,100);  //
  466. para.color[2]=RGB(255,100,255);  //
  467. para.periods[0]=10;
  468. para.periods[1]=15;
  469. para.periods[2]=20;
  470. _lwrite(hf,&para,sizeof(PARA));
  471. memset(&para,0,sizeof(PARA));
  472.     strcpy(para.name,"KDJ");
  473.     para.pnum =1;
  474.     para.dnum =3;
  475. strcpy(para.pname[0],"K");
  476. strcpy(para.pname[1],"D");
  477. strcpy(para.pname[2],"J");
  478. para.color[0]=RGB(255,100,100);  //
  479. para.color[1]=RGB(255,255,100);  //
  480. para.color[2]=RGB(255,100,255);  //
  481. para.periods[0]=9;
  482. _lwrite(hf,&para,sizeof(PARA));
  483.     _lclose(hf);
  484.     
  485. }
  486. int WritePara(PARA *para)
  487. {
  488. OFSTRUCT os;
  489. HFILE hf;
  490. char fname[80];
  491. PARA temp;
  492. int i;
  493. sprintf(fname,"%s\sysset.dat",szDataPath);
  494. if((hf =OpenFile(fname,&os,OF_READWRITE|OF_SHARE_DENY_NONE))==HFILE_ERROR)
  495. return -1;
  496. for(i=0;;i++)
  497. {   
  498. memset(&temp,0,sizeof(PARA));
  499. if(_lread(hf,&temp,sizeof(PARA))!=sizeof(PARA))
  500. break;
  501. if(!strncmp(temp.name,para->name,strlen(para->name)))
  502. {   
  503. memcpy(&para->pname[0],&temp.pname[0],(MAX_PARA_NAME+1)*MAX_DATA_ITEM);
  504.     _lseek(hf,i*sizeof(PARA),SEEK_SET);
  505.     _lwrite(hf,para,sizeof(PARA));
  506. _lclose(hf);
  507. return 0;
  508. }
  509. }
  510.     _lclose(hf);
  511.     return -1;
  512. }
  513. int GetAnalysePara (PARA *para)
  514. {
  515. OFSTRUCT os;
  516. HFILE hf;
  517. char fname[80];
  518. PARA temp;
  519. int i,j,k;
  520. if(strlen(para->name)==0)
  521. {
  522. memset(para,0,sizeof(PARA));
  523. return -1;
  524. }
  525. sprintf(fname,"%s\sysset.dat",szDataPath);
  526. if(access(fname,0)!=0)
  527. WriteDefaultPara();
  528. if((hf =OpenFile(fname,&os,OF_READ|OF_SHARE_DENY_NONE))==HFILE_ERROR)
  529. return -1;
  530. for(;;)
  531. {   
  532. memset(&temp,0,sizeof(PARA));
  533. if(_lread(hf,&temp,sizeof(PARA))!=sizeof(PARA))
  534. break;
  535. if(!strncmp(temp.name,para->name,strlen(para->name)))
  536. {
  537. memcpy(&para->color[0],&temp.color[0],sizeof(COLORREF)*MAX_DATA_ITEM*2);
  538. memcpy(&para->periods[0],&temp.periods[0],sizeof(int)*MAX_DATA_ITEM);
  539. memcpy(&para->pname[0],&temp.pname[0],(MAX_PARA_NAME+1)*MAX_DATA_ITEM);
  540. memset(&para->price[0],0,sizeof(double)*5);
  541. para->pnum =temp.pnum;
  542. para->dnum =temp.dnum;
  543. _lclose(hf);
  544. for(i=0;i<MAX_DATA_ITEM;i++)
  545. {
  546. if(para->color[i]!=0)
  547. para->feature = para->feature|(1L<<i);
  548. }
  549. for(i=0;i<MAX_DATA_ITEM;i++)
  550. {
  551. for(j=0,k=0;j<MAX_DATA_ITEM&&strlen(para->pname[i])!=0;j++)
  552. if(strstr(para->pname[j],para->pname[i])!=NULL) k++;
  553. if(k>1)
  554. {   
  555. strcpy(fname,para->pname[i]);
  556. sprintf(para->pname[i],"%d%s",para->periods[i],fname);
  557. }
  558. }
  559. return 0;
  560. }
  561. }
  562. _lclose(hf);
  563. return -1;
  564. }
  565. void SetAnalysePara(PAINT_PARA *PaintPara)
  566. {
  567. RECT rc;
  568. int i,ltitle,htitle;
  569. HWND hwnd;
  570. char szBuff[80];
  571. PARA *Para;
  572. DATA *Data;
  573. // look for object
  574. Para =FindOpPara();
  575. Data =FindOpData();
  576. if(Para==NULL||Data==NULL)
  577. return;
  578. //look for item
  579. //if(PaintPara->item&DW_NAME)
  580. // i=(int)GetSerial(PaintPara->item);
  581. //else 
  582. if((i=GetNo(Para,PaintPara->item))==-1)
  583. return;
  584. if(Para->periods[i]==0)
  585. return ;
  586. ltitle = (Para->xtitle[1]-Para->xtitle[0])/2;
  587. htitle = Para->htitle;
  588. if(ghWndSetup!=NULL)
  589. {
  590. SendMessage(ghWndSetup,WM_CLOSE,0,0L);
  591. ghWndSetup=NULL;
  592. }
  593. SetRect(&rc,Para->xtitle[0]-ltitle,Para->rc.top +2,
  594. Para->xtitle[0],Para->rc.top +htitle);
  595. ghWndSetup =CreateWindow("EDIT","",WS_VISIBLE|WS_CHILD|WS_DISABLED,
  596.     rc.left,rc.top ,ltitle ,htitle-2,
  597.     ghWndFx,100,ghInstance,NULL);
  598. SetWindowPos(ghWndSetup, HWND_TOPMOST,rc.left,
  599. rc.top ,ltitle ,htitle-2,SWP_SHOWWINDOW);
  600. if(ghWndSetup!=NULL)
  601. {
  602.     SendMessage(hwnd,WM_SETFONT,PaintPara->hFont,0L);
  603.     PaintPara->IsSetPara =TRUE;
  604.     sprintf(szBuff,"%d",Para->periods[i]);
  605.     SetWindowText(ghWndSetup,(LPSTR)szBuff);
  606.     SendMessage(ghWndSetup,EM_SETSEL,(WPARAM)(UINT)0L,(LPARAM)MAKELPARAM(0,-1));
  607. }
  608. LRESULT CALLBACK FxWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  609. {
  610. char tmp[256];
  611. PAINTSTRUCT ps;
  612. RECT rc;
  613. HDC hDc;
  614. LOGFONT lf;
  615. int i, j,x,y;
  616. static clock_t MouDownClk;
  617. POINT pt;
  618. DATA *lpData;
  619. PARA *lpPara;
  620. long flag;
  621.      
  622. switch(message)
  623. {       
  624.     case WM_CREATE:
  625.      MouDownClk=clock();
  626.     break;
  627.         case WM_USER+1:   
  628.          if(Fx->PaintPara.hFont!=NULL)
  629.          DeleteObject(Fx->PaintPara.hFont);
  630. memset(&lf, 0, sizeof(lf));
  631. lf.lfHeight =13;
  632. lf.lfWeight =FW_NORMAL;
  633.      strcpy(lf.lfFaceName,"宋体");
  634.     
  635. lf.lfItalic=0;
  636. lf.lfUnderline=0;    
  637. Fx->PaintPara.hFont =CreateFontIndirect(&lf);
  638.             
  639.      if(Fx->PaintPara.hFont ==0)
  640.      {
  641.      wParam=VK_RETURN;
  642.      SendMessage(ghWndStatus, WM_KEYDOWN, wParam, lParam);
  643.      }
  644.     
  645.     break;
  646.     case WM_SIZE:
  647. GetClientRect(hWnd, &rc);
  648. memcpy(&Fx->PaintPara.rc,&rc,sizeof(RECT));
  649. Fx->PaintPara.rc.top+=30;
  650. Fx->PaintPara.rc.bottom-=20;
  651. MakeWinSpace();
  652. if(IsWindowVisible(ghWndFx))
  653. InvalidateRect(ghWndFx, NULL, TRUE);
  654.     break;
  655. case WM_SETFOCUS:
  656. SetFocus(ghWndMain);
  657. break;
  658. case WM_TIMER:
  659. if(wParam ==1)
  660. {   
  661. Fx->PaintPara.IsPainting=FALSE;
  662. KillTimer(ghWndFx,1);
  663. }
  664. if(wParam ==2)
  665. PostMessage(hWnd,WM_USER+1,NULL,NULL);
  666. break;
  667. case WM_KILLFOCUS:
  668.     if(Fx->PaintPara.IsScroll)
  669.       DrawScroll(Fx,SCROLL_CANCEL);
  670.             if(Fx->PaintPara.IsUpDown)
  671.                 UpDown(Fx,0);
  672. break;
  673. case WM_CTLCOLOR:
  674. if(HIWORD(lParam) ==CTLCOLOR_STATIC)
  675. {
  676. hDc =(HDC)wParam;
  677. SetTextColor(hDc, RGB(255, 0, 0));
  678. SelectObject(hDc, Fx->PaintPara.hFont);
  679. return (LRESULT)(HBRUSH)GetStockObject(WHITE_BRUSH);
  680. }
  681. break;
  682. case WM_LBUTTONDOWN:
  683. if(!Fx->PaintPara.IsSetPara)
  684. {
  685. x=LOWORD(lParam);
  686. y=HIWORD(lParam);
  687. pt.x=x=LOWORD(lParam);
  688. pt.y=y=HIWORD(lParam);
  689. lpPara =FindOpPara();
  690. lpData =FindOpData();
  691. if(lpPara!=NULL&&lpData!=NULL)
  692. {   
  693. UpDown(Fx,0);
  694. Fx->PaintPara.object=0;
  695. flag =Fx->PaintPara.item&lpPara->feature&DW_OBJECT;
  696. flag =flag|Fx->PaintPara.item&DW_ATTR;
  697. DrawDiagram(NULL,Fx->CurRecPrt,Fx->ShowDot,lpPara,lpData,&Fx->PaintPara,flag&~DW_SELE&~DW_FRAME);
  698. }
  699. lpPara =&Fx->KxPara;
  700. lpData =&Fx->KxData;
  701. do
  702. {
  703.     if(PtInRect(&lpPara->rc,pt))
  704.      break;
  705. lpPara =lpPara->next;
  706. lpData =lpData->next;
  707. }while(lpPara!=NULL&&lpData!=NULL);
  708. if(lpPara!=NULL&&lpData!=NULL)
  709. {
  710. flag=GetObjectItem(x,y,Fx->CurRecPrt,Fx->ShowDot,lpPara,lpData,&Fx->PaintPara);
  711. Fx->PaintPara.object=lpPara->no;
  712. Fx->PaintPara.item =flag;
  713. flag =flag&lpPara->feature&DW_OBJECT;
  714. flag =flag|Fx->PaintPara.item&DW_ATTR;
  715. DrawDiagram(NULL,Fx->CurRecPrt,Fx->ShowDot,lpPara,lpData,&Fx->PaintPara,DW_SELE|flag);
  716. }
  717. }
  718. break;
  719. case WM_RBUTTONDOWN:
  720.     pt.x=x=LOWORD(lParam);
  721. pt.y=y=HIWORD(lParam);
  722. break;
  723. case WM_PAINT:
  724.     //if(!LoadData(Fx))
  725.     //{
  726.     //    wParam=VK_RETURN;
  727.     //    Msg(0,0,"没有分析数据!",MSG_TIME|MSG_FOCU|MSG_HORT,RGB(255,0,0));
  728.     //    ValidateRect(hWnd,NULL);
  729.     //}
  730.             //else
  731.             //{
  732. hDc=BeginPaint(hWnd, &ps);
  733. if(!LoadData(Fx))
  734. {
  735. SetTextColor(hDc,RGB(255,0,0));
  736. SetBkColor(hDc,RGB(255,255,255));
  737. strcpy(tmp,"正在通讯,请稍候...");
  738. TextOut(hDc,0,2,tmp,strlen(tmp));
  739. }
  740. else
  741. {
  742. lpData =&Fx->KxData;
  743. lpPara =&Fx->KxPara;                
  744.                 GetDiagramName(lpPara,Fx->range,Fx->gpmc);
  745. do
  746. {
  747. if(lpPara->rc.right !=0)
  748. DrawDiagram(hDc,Fx->CurRecPrt,Fx->ShowDot,lpPara,lpData,&Fx->PaintPara,0L);
  749. lpData =lpData->next;
  750. lpPara =lpPara->next;
  751. }while(lpData!=NULL&&lpPara!=NULL);
  752. }
  753. EndPaint(hWnd, &ps);
  754. break;   
  755. case WM_KEYDOWN:
  756.     switch(wParam)
  757.     {
  758.      case VK_F1:
  759. ShowWindow(ghWndHelp,SW_SHOW);
  760. sprintf(tmp,"%s\help.txt",szDataPath);
  761. i=LoadFile(tmp,0,"帮助/[ESC]退出");
  762. return 0L;
  763.     case VK_F2:
  764.      SendMessage(ghWndMain,WM_COMMAND,IDM_JY,NULL);     
  765. return 0L;
  766. case VK_F3:
  767.     SendMessage(ghWndXlt,WM_KEYDOWN,VK_F3,0L);
  768. return 0L;
  769. case VK_F4:
  770. if(Fx->range<MONTH)
  771. Fx->range++;
  772. else
  773. Fx->range=MIN_5;
  774. Fx->IsDataOk =FALSE;
  775.                     InvalidateRect(ghWndFx, NULL, TRUE);
  776.                 case VK_F9: 
  777.                  if(Fx->PaintPara.item&DW_OBJECT) 
  778.                  {
  779.                      if(SetColor(ghWndFx)==0)
  780.                      {
  781.                      lpPara =FindOpPara();
  782.                      lpData =FindOpData();
  783.                      if(lpPara!=NULL&lpData!=NULL)
  784.                      {
  785.                      if(Fx->PaintPara.item&DW_NAME)
  786.                      i=-1;
  787.                      else
  788.                      {
  789. i=GetNo(lpPara,Fx->PaintPara.item);
  790. j=(int)GetSerial(Fx->PaintPara.item);
  791. }
  792. if(i!=-1&j==0|j==1)
  793. lpPara->color[i+j*10] =cc.rgbResult;
  794. WritePara(lpPara);
  795. flag =lpPara->feature&DW_ATTR|(1L<<i);
  796. DrawDiagram(NULL,Fx->CurRecPrt,Fx->ShowDot,lpPara,lpData,&Fx->PaintPara,flag);
  797.                      }
  798.                      }
  799.                     }
  800. break;
  801. case VK_F11:
  802.     SetAnalysePara(&Fx->PaintPara);
  803. break;
  804. case VK_F12:
  805. SendMessage(ghWndXlt, WM_KEYDOWN, VK_F12, 0L);
  806. break;
  807.       case VK_ESCAPE:
  808.       if(Fx->PaintPara.IsSetPara)
  809.       {
  810. SendMessage(ghWndSetup,WM_CLOSE,0,0L);
  811. ghWndSetup=NULL;
  812.       Fx->PaintPara.IsSetPara =FALSE;
  813.       break;
  814.       }
  815.           if(Fx->PaintPara.IsScroll)
  816.           {
  817.            DrawScroll(Fx,SCROLL_CANCEL);
  818.            break;
  819.           }
  820.           else if(Fx->PaintPara.IsUpDown)
  821.           {
  822.            UpDown(Fx,0);
  823.            break;
  824.           }
  825.       //case VK_F9:      
  826.       case VK_RETURN:
  827. if(HqData[GraphData.jys].recCount <=0) break;
  828.           if(Fx->PaintPara.IsScroll)
  829.            DrawScroll(Fx,SCROLL_CANCEL);
  830. strcpy(tmp,"");
  831. if(ghWndSetup!=NULL&&Fx->PaintPara.IsSetPara)
  832. {
  833. GetWindowText(ghWndSetup, &tmp[0], sizeof(tmp));
  834. SetWindowText(ghWndSetup,"");
  835. SetWindowText(hWndInput,"");
  836. if(atoi(tmp)==0) break;
  837. lpPara =FindOpPara();
  838. lpData =FindOpData();
  839. if(lpPara!=NULL)
  840. {    
  841. i=GetNo(lpPara,Fx->PaintPara.item);
  842. if(i!=-1)
  843. lpPara->periods[i] =atoi(tmp);
  844. WritePara(lpPara);
  845. GetAnalysePara (lpPara);
  846. }
  847. SendMessage(ghWndSetup,WM_CLOSE,0,0L);
  848. ghWndSetup=NULL;
  849. if(lpData==NULL||lpData->no!=lpPara->no)
  850. break;
  851. if(lpPara->no ==1)
  852. InitObjectOne();
  853. else if(lpPara->no ==2)
  854. InitObjectTwo();
  855. else
  856. {
  857.       for(j=0;j<Fx->PaintPara.num;j++)
  858.       {
  859.       if(lpData->type ==INIT_TABLE[j].type)
  860.       break;
  861.       }
  862. if(j<Fx->PaintPara.num)
  863. (*INIT_TABLE[j].CreateData)(Fx->MainData,Fx->RecCount,lpData,lpPara);
  864. else
  865. break;
  866. }
  867. flag =lpPara->feature&DW_ATTR|(1L<<i);
  868. DrawDiagram(NULL,Fx->CurRecPrt,Fx->ShowDot,lpPara,lpData,&Fx->PaintPara,flag);
  869. Fx->PaintPara.IsSetPara =FALSE;
  870. break;
  871. }
  872. GetWindowText(hWndInput, &tmp[0], sizeof(tmp));
  873. if(tmp[0] ==0)
  874. {
  875.    ShowWindow(ghWndMmp, SW_HIDE);
  876. ShowWindow(ghWndCj, SW_HIDE);
  877. ShowWindow(ghWndLitHq, SW_HIDE);
  878. ShowWindow(ghWndMaxMin, SW_HIDE);
  879. ShowWindow(ghWndZs, SW_HIDE);
  880.          FxFreeData(Fx);
  881.          ShowWindow(ghWndFx,SW_HIDE);
  882. ShowWindow(ghWndHq, SW_SHOW);
  883. KillTimer(ghWndHq, 5);
  884. SetTimer(ghWndHq, 5, 1000, NULL);
  885. SetFocus(ghWndHq);
  886.       break;
  887.                      }
  888.                      else
  889.                      {   
  890. for(j =0; j<2; j++)
  891. {
  892. for(i =0; i<HqData[j].recCount; i++)
  893. {
  894. if(!strcmp(HqData[j].lpPreData[i].zqdm, tmp))
  895. break;
  896. }
  897. if(i <HqData[j].recCount) break;
  898. }
  899. if(j<2 && i <HqData[j].recCount)
  900. {
  901. GraphData.minEnd =0;
  902. GraphData.jys =j;
  903. GraphData.recNum =i;
  904. SendMessage(hWnd, WM_KILLFOCUS, 0, 0L);
  905. InvalidateRect(ghWndLitHq, NULL, TRUE);
  906. UDP_Send_Gra00(j, i);
  907. if(IsZsRec(j, i))
  908. {
  909. if(!IsWindowVisible(ghWndZs))
  910. {
  911. ShowWindow(ghWndZs, SW_SHOW);
  912. ShowWindow(ghWndMmp, SW_HIDE);
  913. ShowWindow(ghWndCj, SW_HIDE);
  914. ShowWindow(ghWndMaxMin, SW_SHOW);
  915. }
  916. }
  917. else
  918. {
  919. if(IsWindowVisible(ghWndZs))
  920. {
  921. ShowWindow(ghWndZs, SW_HIDE);
  922. ShowWindow(ghWndMmp, SW_SHOW);
  923. ShowWindow(ghWndCj, SW_SHOW);
  924. ShowWindow(ghWndMaxMin, SW_HIDE);
  925. }
  926. SendMessage(ghWndCj, WM_READ_OK, 0, 0L);
  927. }
  928. }
  929.                         strcpy(Fx->gpdm, HqData[GraphData.jys].lpPreData[GraphData.recNum].zqdm);
  930.                         strcpy(Fx->gpmc, HqData[GraphData.jys].lpPreData[GraphData.recNum].zqmc);
  931.                         if(Fx->type==NULL)
  932.                             Fx->type=IDM_FX_MACD;
  933.                         Fx->range=DAY;
  934.                         FxFreeData(Fx);
  935.                         UDP_Send_DataDay(GraphData.jys,GraphData.recNum);
  936.                         InvalidateRect(ghWndFx, NULL, TRUE);
  937. SetWindowText(hWndInput, "");
  938.                     }
  939. break;
  940.       case VK_UP:
  941.       UpDown(Fx,1);
  942.       break;
  943.       case VK_DOWN:
  944.       UpDown(Fx,-1);
  945.       break;
  946.       case VK_LEFT:
  947.           if(Fx->RecCount!=0&&!Fx->PaintPara.IsSetPara)
  948.       DrawScroll(Fx,SCROLL_LEFT);
  949.       break;
  950.       case VK_RIGHT:      
  951.       if(Fx->RecCount!=0&&!Fx->PaintPara.IsSetPara)
  952.            DrawScroll(Fx,SCROLL_RIGHT);
  953.       break; 
  954.       case VK_HOME:
  955.       if(Fx->RecCount!=0&&!Fx->PaintPara.IsSetPara)
  956.            DrawScroll(Fx,SCROLL_HOME);
  957.       break;
  958.       case VK_END:
  959.       if(Fx->RecCount!=0&&!Fx->PaintPara.IsSetPara)
  960.            DrawScroll(Fx,SCROLL_END);
  961.       break;            
  962.       case VK_ADD:
  963.           if(Fx->RecCount!=0)
  964.           {
  965.       if(Fx->PaintPara.IsScroll||Fx->PaintPara.IsUpDown)
  966.       SendMessage(hWnd, WM_KILLFOCUS, 0, 0L);
  967.       if(Fx->ShowDot<Fx->RecCount)
  968.       {
  969.       Fx->ShowDot+=30;
  970.       if(Fx->ShowDot>Fx->RecCount)
  971.       Fx->ShowDot=Fx->RecCount;
  972.       Fx->CurRecPrt=Fx->RecCount-Fx->ShowDot;
  973.       InvalidateRect(hWnd, NULL, TRUE);
  974.       }      
  975.       }
  976.       break; 
  977.       case VK_SUBTRACT:
  978.       if(Fx->RecCount!=0)
  979.       {
  980.       if(Fx->PaintPara.IsScroll||Fx->PaintPara.IsUpDown)
  981.       SendMessage(hWnd, WM_KILLFOCUS, 0, 0L);
  982.       if(Fx->ShowDot>DEFSHOWDOT)
  983.       {
  984.       Fx->ShowDot-=30;
  985.       if(Fx->ShowDot<DEFSHOWDOT-200)
  986.       Fx->ShowDot=DEFSHOWDOT-200;
  987.       Fx->CurRecPrt=Fx->RecCount-Fx->ShowDot;
  988.       InvalidateRect(hWnd, NULL, TRUE);
  989.       }            
  990.       }
  991.       break;
  992.       case VK_DIVIDE:
  993.       if(Fx->PaintPara.IsScroll)
  994.       DrawScroll(Fx,SCROLL_CANCEL);  
  995.       if(Fx->PaintPara.IsUpDown)
  996.       UpDown(Fx,0);
  997.       Fx->PaintPara.IsAvLineShow=!Fx->PaintPara.IsAvLineShow;
  998.       InvalidateRect(hWnd, NULL, TRUE);      
  999.       break;
  1000.       case VK_MULTIPLY: 
  1001.       if(Fx->PaintPara.IsScroll)
  1002.       DrawScroll(Fx,SCROLL_CANCEL);  
  1003.       if(Fx->PaintPara.IsUpDown)      
  1004.       UpDown(Fx,0);
  1005.       Fx->PaintPara.IsMax=!Fx->PaintPara.IsMax;
  1006.       InvalidateRect(hWnd, NULL, TRUE);
  1007.       break;
  1008.       case VK_PRIOR:
  1009.       CheckMenuItem(ghMenuMain, Fx->type, MF_BYCOMMAND|MF_UNCHECKED);
  1010.       for(i=0;i<Fx->PaintPara.num;i++)
  1011.       {
  1012.       if(Fx->type ==INIT_TABLE[i].type)
  1013.       break;
  1014.       }
  1015.       if(i==0)
  1016.       i=Fx->PaintPara.num -1;
  1017.       else if(i>=Fx->PaintPara.num)
  1018.       i=0;
  1019.       else
  1020.       i=i-1;      
  1021.       Fx->type =INIT_TABLE[i].type;
  1022.       strcpy(Fx->Para->name,INIT_TABLE[i].name);
  1023.       GetAnalysePara(Fx->Para);
  1024. CheckMenuItem(ghMenuMain, Fx->type, MF_BYCOMMAND|MF_CHECKED);
  1025. (*INIT_TABLE[i].CreateData)(Fx->MainData,Fx->RecCount,Fx->Data,Fx->Para);
  1026. GetDiagramName(&Fx->KxPara,Fx->range,Fx->gpmc);
  1027. DrawScroll(Fx,SCROLL_CANCEL);
  1028. if(Fx->Para->rc.right ==0)
  1029. {
  1030. MakeWinSpace();
  1031. InvalidateRect(ghWndFx, NULL, TRUE);
  1032. }
  1033. else
  1034. DrawDiagram(NULL,Fx->CurRecPrt,Fx->ShowDot,Fx->Para,Fx->Data,&Fx->PaintPara,0L);
  1035.       break;
  1036.       case VK_NEXT:
  1037. CheckMenuItem(ghMenuMain, Fx->type, MF_BYCOMMAND|MF_UNCHECKED);      
  1038.       for(i=0;i<Fx->PaintPara.num;i++)
  1039.       {
  1040.       if(Fx->type ==INIT_TABLE[i].type)
  1041.       break;
  1042.       }
  1043.       if(i==Fx->PaintPara.num -1)
  1044.       i=0;
  1045.       else if(i>=Fx->PaintPara.num)
  1046.       i=0;
  1047.       else
  1048.       i=i+1;      
  1049.       Fx->type =INIT_TABLE[i].type;
  1050.       strcpy(Fx->Para->name,INIT_TABLE[i].name);
  1051.       GetAnalysePara(Fx->Para);
  1052. CheckMenuItem(ghMenuMain, Fx->type, MF_BYCOMMAND|MF_CHECKED);
  1053. (*INIT_TABLE[i].CreateData)(Fx->MainData,Fx->RecCount,Fx->Data,Fx->Para);
  1054. GetDiagramName(&Fx->KxPara,Fx->range,Fx->gpmc);
  1055. DrawScroll(Fx,SCROLL_CANCEL);
  1056. if(Fx->Para->rc.right ==0)
  1057. {
  1058. MakeWinSpace();
  1059. InvalidateRect(ghWndFx, NULL, TRUE);
  1060. }
  1061. else
  1062. DrawDiagram(NULL,Fx->CurRecPrt,Fx->ShowDot,Fx->Para,Fx->Data,&Fx->PaintPara,0L);
  1063.         break;
  1064.         case VK_DELETE:
  1065.          lpPara =FindOpPara();
  1066.          lpData =FindOpData();
  1067.          if(!(lpPara->feature&DW_BASE))
  1068.          {
  1069.              Fx->PaintPara.item=0L;
  1070.            MakeWinSpace();
  1071.            InvalidateRect(ghWndFx, NULL, FALSE);
  1072.          }
  1073.          else if(Fx->PaintPara.item&DW_OBJECT)
  1074.          {   
  1075.              flag =Fx->PaintPara.item;
  1076.              Fx->PaintPara.item=Fx->PaintPara.item^(flag&DW_OBJECT);
  1077.              lpPara->feature=lpPara->feature^(flag&DW_OBJECT);
  1078.          DrawDiagram(NULL,Fx->CurRecPrt,Fx->ShowDot,lpPara,lpData,&Fx->PaintPara,flag|DW_DELE);
  1079.          }
  1080.         break;
  1081.         case VK_INSERT:
  1082.          lpPara =FindOpPara();
  1083.          lpData =FindOpData();
  1084.          if(lpPara!=NULL&&lpData!=NULL)
  1085.          {
  1086.          for(i=0;i<MAX_DATA_ITEM;i++)
  1087.          {
  1088.          if(lpPara->color[i]!=0&&!(lpPara->feature&(1L<<i)))
  1089.          break;
  1090.          }
  1091.          if(i<MAX_DATA_ITEM)
  1092.          {   
  1093.              lpPara->feature|=1L<<i;
  1094.              flag=(lpPara->feature&DW_ATTR)|1L<<i;
  1095.          DrawDiagram(NULL,Fx->CurRecPrt,Fx->ShowDot,lpPara,lpData,&Fx->PaintPara,flag);
  1096.          }
  1097.          else
  1098.          {
  1099.            lpPara =&Fx->KxPara;
  1100.            lpData =&Fx->KxData;
  1101.            do
  1102.            {
  1103.            if(lpPara->rc.right==0)
  1104.            break;
  1105.            lpPara=lpPara->next;
  1106.            lpData=lpData->next;
  1107.            }while(lpPara!=NULL&&lpData!=NULL);
  1108.            if(lpPara!=NULL&&lpData!=NULL)
  1109.            {
  1110.          for(i=0;i<MAX_DATA_ITEM;i++)
  1111.          {
  1112.          if(lpPara->color[i]!=0&&!(lpPara->feature&(1L<<i)))
  1113.          break;
  1114.          }
  1115.          if(i<MAX_DATA_ITEM)
  1116.          {   
  1117.               lpPara->feature|=1L<<i;
  1118.               MakeWinSpace();
  1119.               InvalidateRect(ghWndFx, NULL, TRUE);
  1120.          }           
  1121.            }
  1122.          }
  1123.          }
  1124.         break;
  1125.         default:
  1126.          if(ghWndSetup!=NULL)         
  1127.          SendMessage(ghWndSetup,WM_CHAR,wParam,lParam);
  1128.         break;
  1129.     }
  1130. break;
  1131. case WM_COMMAND:
  1132. switch(wParam)
  1133. {
  1134. case IDM_EXIT:
  1135.     SendMessage(hWnd, WM_CLOSE, 0, 0L);
  1136.         break;
  1137. case IDM_HQ_SZ:
  1138. case IDM_HQ_SH:
  1139. case IDM_HQSEL_1:
  1140. case IDM_HQSEL_2:
  1141. case IDM_HQSEL_3:
  1142. case IDM_HQSEL_4:
  1143. case IDM_HQSEL_5:
  1144. case IDM_GRAPH:
  1145. ShowWindow(hWnd,SW_HIDE);
  1146. SendMessage(ghWndHq, WM_COMMAND, wParam, 0L);
  1147. break;          
  1148.             }
  1149. break;
  1150. //case WM_DESTROY:
  1151. // if(Fx->PaintPara.hFont) 
  1152. // DeleteObject(Fx->PaintPara.hFont);
  1153. // Fx->PaintPara.hFont =NULL;
  1154. //break;
  1155. }
  1156. return DefWindowProc(hWnd, message, wParam, lParam);
  1157. }
  1158. int CompWeek(char *date1,char *date2)
  1159. {
  1160. struct tm Tm[2];
  1161. time_t Time[2];
  1162. int i,last;
  1163. char temp[20],tmp[20];
  1164. for(i=0;i<2;i++)
  1165. {
  1166. if(i==0)
  1167. strcpy(tmp,date1);
  1168. else
  1169. strcpy(tmp,date2);
  1170. memset(&Tm[i],0,sizeof(struct tm));
  1171. strncpy(temp,&tmp[0],4);
  1172. Tm[i].tm_year =atoi(temp)-1900;
  1173. strncpy(temp,&tmp[4],2);
  1174. temp[2]=0;
  1175. Tm[i].tm_mon =atoi(temp) -1;
  1176. strncpy(temp,&tmp[6],2);
  1177. temp[2]=0;
  1178. Tm[i].tm_mday =atoi(temp);
  1179. Tm[i].tm_isdst =0;
  1180. if((Time[i]=mktime(&Tm[i]))==-1)
  1181. return -1;
  1182. memcpy(&Tm[i],(char *)gmtime(&Time[i]),sizeof(struct tm));
  1183.        }
  1184.        if(Time[0] ==Time[1])
  1185. return 0;
  1186.        else if(Time[0]<Time[1])
  1187.        {
  1188. if(Tm[0].tm_wday ==0)
  1189. return 1;
  1190. else
  1191. last =7 -Tm[0].tm_wday;
  1192. if((difftime(Time[1],Time[0])/3600)/24<=last)
  1193. return 0;
  1194. else
  1195. return 1;
  1196.        }
  1197.        else
  1198.        {
  1199. if(Tm[1].tm_wday ==0)
  1200. return 1;
  1201. else
  1202. last =7 -Tm[1].tm_wday;
  1203. if((difftime(Time[0],Time[1])/3600)/24<=last)
  1204. return 0;
  1205. else
  1206. return 1;
  1207.        }
  1208. }
  1209. int InitObjectOne(void)
  1210. {
  1211. long i,j;
  1212. double Ave;
  1213.     Fx->KxData.num =Fx->KxPara.dnum; 
  1214.     Fx->KxData.no =Fx->KxPara.no;
  1215.     strcpy(Fx->KxData.gpdm,Fx->gpdm);
  1216.     Fx->KxData.type =Fx->type;
  1217.     Fx->KxData.range =Fx->range;
  1218.     Fx->KxData.size =Fx->RecCount;
  1219.     //Fx->KxPara.feature =DW_ALL;
  1220. for(i=0;i<Fx->KxData.num;i++)
  1221. {
  1222. if(Fx->KxData.v[i]!=NULL)
  1223. _ffree(Fx->KxData.v[i]);
  1224. Fx->KxData.v[i] =(double*)_fmalloc(sizeof(double)*Fx->RecCount);
  1225. memset(Fx->KxData.v[i],0,sizeof(double)*Fx->RecCount);
  1226. }
  1227. for(i=0;i<Fx->KxData.num;i++)
  1228. {
  1229. if(i<4)
  1230. {
  1231.      for(j=0;j<Fx->RecCount&&i==0;j++) 
  1232.      Fx->KxData.v[i][j]=Fx->MainData[j].ks;
  1233.      for(j=0;j<Fx->RecCount&&i==1;j++) 
  1234.      Fx->KxData.v[i][j]=Fx->MainData[j].ss;
  1235.      for(j=0;j<Fx->RecCount&&i==2;j++) 
  1236.      Fx->KxData.v[i][j]=Fx->MainData[j].zg;
  1237.      for(j=0;j<Fx->RecCount&&i==3;j++) 
  1238.      Fx->KxData.v[i][j]=Fx->MainData[j].zd;
  1239.      Fx->KxData.method[i]=PRICE_BAR_METHOD;
  1240.      }
  1241.      else
  1242.      {
  1243.          Ave = 0;
  1244.          for(j=0;j<Fx->RecCount;j++)
  1245.          {
  1246.           if(Fx->KxPara.periods[i]==0)
  1247.           break;
  1248.           if(j<Fx->KxPara.periods[i]-1)
  1249.           Ave +=Fx->MainData[j].ss;
  1250.           else if(j==Fx->KxPara.periods[i]-1)
  1251.           {
  1252.               Ave +=Fx->MainData[j].ss;
  1253.           Fx->KxData.v[i][j]=Ave/Fx->KxPara.periods[i];
  1254.           }
  1255.                 else
  1256.             Fx->KxData.v[i][j]=Fx->MainData[j].ss/Fx->KxPara.periods[i]+Fx->KxData.v[i][j-1]-
  1257.             Fx->MainData[j-Fx->KxPara.periods[i]].ss/Fx->KxPara.periods[i];
  1258.          }
  1259.        Fx->KxData.method[i]=CURVE_METHOD;
  1260.      }
  1261. }
  1262.     return TRUE;
  1263. }
  1264. int InitObjectTwo()
  1265. {
  1266. double Ave;
  1267. long i,j;
  1268.     Fx->CjlData.num =Fx->CjlPara.dnum; 
  1269.     Fx->CjlData.no =Fx->CjlPara.no;
  1270.     strcpy(Fx->CjlData.gpdm,Fx->gpdm);
  1271.     Fx->CjlData.type =Fx->type;
  1272.     Fx->CjlData.range =Fx->range;
  1273.     Fx->CjlData.size =Fx->RecCount;
  1274.     //Fx->CjlPara.feature =DW_ALL;
  1275. for(i=0;i<Fx->CjlData.num;i++)
  1276. {
  1277. if(Fx->CjlData.v[i]!=NULL)
  1278. _ffree(Fx->CjlData.v[i]);
  1279. Fx->CjlData.v[i] =(double*)_fmalloc(sizeof(double)*Fx->RecCount);
  1280. memset(Fx->CjlData.v[i],0,sizeof(double)*Fx->RecCount);
  1281. }
  1282. for(i=0;i<Fx->CjlData.num;i++)
  1283. {
  1284. if(i<2)
  1285. {
  1286.      for(j=0;j<Fx->RecCount&&i==0;j++) 
  1287.      Fx->CjlData.v[i][j]=Fx->MainData[j].cj;
  1288.      for(j=0;j<Fx->RecCount&&i==1;j++) 
  1289.      Fx->CjlData.v[i][j]=Fx->MainData[j].ks-Fx->MainData[j].ss;
  1290.      Fx->CjlData.method[i]=VOULMN_BAR_METHOD;
  1291.      }
  1292.      else
  1293.      {
  1294.          Ave = 0;
  1295.          for(j=0;j<Fx->RecCount;j++)
  1296.          {
  1297.           if(Fx->CjlPara.periods[i]==0)
  1298.           break;
  1299.           if(j<Fx->CjlPara.periods[i]-1)
  1300.           Ave +=Fx->MainData[j].cj;
  1301.           else if(j==Fx->CjlPara.periods[i]-1)
  1302.           {
  1303.               Ave +=Fx->MainData[j].cj;
  1304.           Fx->CjlData.v[i][j]=Ave/Fx->CjlPara.periods[i];
  1305.           }
  1306.                 else
  1307.             Fx->CjlData.v[i][j]=Fx->MainData[j].cj/Fx->CjlPara.periods[i]+Fx->CjlData.v[i][j-1]-
  1308.             Fx->MainData[j-Fx->CjlPara.periods[i]].cj/Fx->CjlPara.periods[i];
  1309.          }
  1310.        Fx->CjlData.method[i]=CURVE_METHOD;
  1311.      }
  1312. }
  1313. return TRUE;
  1314. }   
  1315. int LoadData(FX *Fx)
  1316. {                
  1317. char temp[80];
  1318. HFILE hFile;
  1319. OFSTRUCT os;
  1320. long i,j;
  1321. K_DATA KBuff;
  1322. DAY_DATA DayBuff;
  1323. if(Fx->IsDataOk) return TRUE;
  1324. switch(Fx->range)
  1325. {
  1326. case MIN_5:
  1327.     case MIN_15:
  1328.     case MIN_30:
  1329.     case MIN_60:
  1330. if(!CreateHistoryData(Fx->range,Fx->gpdm))
  1331. return FALSE;   
  1332. wsprintf(temp,"%s\%s.%d",szDataPath,Fx->gpdm,Fx->range);
  1333. //unlink(temp);
  1334. break;
  1335.     case WEEK:
  1336.     case MONTH:
  1337.     case DAY:
  1338. wsprintf(temp,"%s\%s.day",szDataPath,Fx->gpdm);
  1339. break;
  1340.     default:
  1341. return FALSE;
  1342. }
  1343.   
  1344. hFile =OpenFile(temp, &os, OF_READ);
  1345. if(hFile ==HFILE_ERROR)
  1346. {
  1347. Fx->TotalCount=Fx->RecCount=Fx->ShowDot=0;
  1348. return FALSE;
  1349. }
  1350. else
  1351. {
  1352. Fx->TotalCount=Fx->RecCount=(int)_llseek(hFile,0L,SEEK_END)/sizeof(K_DATA); 
  1353. if(Fx->RecCount==0L) return FALSE;
  1354. if(Fx->ShowDot<=0) Fx->ShowDot=DEFSHOWDOT;
  1355. if(Fx->RecCount>MAXSHOWDOT) Fx->RecCount=MAXSHOWDOT;
  1356. if(Fx->ShowDot>Fx->RecCount) Fx->ShowDot=Fx->RecCount;
  1357. }
  1358. if(!Fx->MainData)
  1359. Fx->MainData=(MAIN_DATA *)_fmalloc(sizeof(MAIN_DATA)*Fx->RecCount);
  1360. else 
  1361. Fx->MainData=(MAIN_DATA *)_frealloc(Fx->MainData,sizeof(MAIN_DATA)*Fx->RecCount);
  1362. memset(Fx->MainData,0,sizeof(K_DATA)*Fx->RecCount);
  1363.     //取历史数据 加载主数据
  1364. for(i=Fx->TotalCount-Fx->RecCount,j=0;i<Fx->TotalCount&&!Fx->IsDataOk;i++)
  1365. {
  1366.     memset(&DayBuff,0,sizeof(DAY_DATA));
  1367.   if(_llseek(hFile,i*sizeof(DAY_DATA),SEEK_SET)==HFILE_ERROR) 
  1368.   {
  1369.       _lclose(hFile);
  1370.   return FALSE;    
  1371.   }
  1372. if(_lread(hFile,&DayBuff,sizeof(DAY_DATA))==HFILE_ERROR)
  1373. {                 
  1374. _lclose(hFile);
  1375. return FALSE;
  1376.       }
  1377.       if(Fx->range>MIN_60)
  1378.       sprintf(KBuff.date,"%ld",DayBuff.day);
  1379.       else
  1380.       sprintf(KBuff.date,"%04ld%02ld%02ld",DayBuff.day/1000,
  1381.       (DayBuff.day%1000L)/60L,(DayBuff.day%1000L)%60L);
  1382.       KBuff.ks=DayBuff.kpjg;
  1383.       KBuff.ss=DayBuff.spjg;
  1384.       KBuff.zg=DayBuff.zgjg;
  1385.       KBuff.zd=DayBuff.zdjg;
  1386.       KBuff.cj=DayBuff.cjss;
  1387.        
  1388.       if(KBuff.zg<=0||KBuff.zd<=0||KBuff.ss<=0||KBuff.ks<=0) 
  1389.       continue;
  1390.         memcpy(&Fx->MainData[j],&KBuff,sizeof(MAIN_DATA));
  1391.   j++;
  1392. _lclose(hFile);
  1393. Fx->RecCount=(int)j;
  1394. //计算周线 
  1395. if(Fx->range ==WEEK)
  1396. {
  1397. i=j=0;
  1398. while(i<Fx->RecCount)
  1399. {
  1400. strcpy(KBuff.date,Fx->MainData[i].date);
  1401. KBuff.cj =Fx->MainData[i].cj;
  1402. KBuff.zg =Fx->MainData[i].zg;
  1403. KBuff.zd =Fx->MainData[i].zd;
  1404. KBuff.ks =Fx->MainData[i].ks;
  1405. KBuff.ss =Fx->MainData[i].ss;
  1406.     
  1407.     i++;
  1408. while(i<Fx->RecCount&&CompWeek(KBuff.date,Fx->MainData[i].date)==0) 
  1409. {
  1410. KBuff.cj+=Fx->MainData[i].cj;
  1411. KBuff.ss =Fx->MainData[i].ss;
  1412. if(KBuff.zg<Fx->MainData[i].zg)
  1413. KBuff.zg=Fx->MainData[i].zg;
  1414. if(KBuff.zd>Fx->MainData[i].zd)
  1415. KBuff.zd=Fx->MainData[i].zd;
  1416. i++;
  1417. }
  1418. strcpy(Fx->MainData[j].date,KBuff.date);
  1419.             Fx->MainData[j].ks =KBuff.ks;
  1420.             Fx->MainData[j].ss =KBuff.ss;
  1421.             Fx->MainData[j].zg =KBuff.zg;
  1422.             Fx->MainData[j].zd =KBuff.zd;
  1423.             Fx->MainData[j].cj =KBuff.cj;
  1424.             j++;
  1425. }
  1426. Fx->RecCount=(int)j;
  1427. //计算月线
  1428. if(Fx->range ==MONTH)
  1429. {
  1430. i=j=0;
  1431. while(i<Fx->RecCount)
  1432. {
  1433. strcpy(KBuff.date,Fx->MainData[i].date);
  1434. KBuff.cj =Fx->MainData[i].cj;
  1435. KBuff.zg =Fx->MainData[i].zg;
  1436. KBuff.zd =Fx->MainData[i].zd;
  1437. KBuff.ks =Fx->MainData[i].ks;
  1438. KBuff.ss =Fx->MainData[i].ss;
  1439.     
  1440.     i++;
  1441. while(i<Fx->RecCount&&strncmp(KBuff.date,Fx->MainData[i].date,6)==0)
  1442. {
  1443. KBuff.cj+=Fx->MainData[i].cj;
  1444. KBuff.ss =Fx->MainData[i].ss;
  1445. if(KBuff.zg<Fx->MainData[i].zg)
  1446. KBuff.zg=Fx->MainData[i].zg;
  1447. if(KBuff.zd>Fx->MainData[i].zd)
  1448. KBuff.zd=Fx->MainData[i].zd;
  1449. i++;
  1450. }
  1451. strcpy(Fx->MainData[j].date,KBuff.date);
  1452.             Fx->MainData[j].ks =KBuff.ks;
  1453.             Fx->MainData[j].ss =KBuff.ss;
  1454.             Fx->MainData[j].zg =KBuff.zg;
  1455.             Fx->MainData[j].zd =KBuff.zd;
  1456.             Fx->MainData[j].cj =KBuff.cj;
  1457.             j++;
  1458. }
  1459. Fx->RecCount=(int)j;
  1460. Fx->ShowDot=DEFSHOWDOT;
  1461. if(Fx->ShowDot>Fx->RecCount) Fx->ShowDot=Fx->RecCount ;
  1462. //加载K线数据  
  1463. InitObjectOne();
  1464. //加载成交量数据
  1465. InitObjectTwo();
  1466. //计算分析数据
  1467.     for(i=0;i<Fx->PaintPara.num;i++)
  1468.     {
  1469.      if(INIT_TABLE[i].type ==Fx->type)
  1470.      break;
  1471.     }
  1472.     if(i>=Fx->PaintPara.num)
  1473.     {
  1474.      i=0;
  1475.      Fx->type =IDM_FX_MACD;
  1476.     }
  1477.     strcpy(Fx->Para->name,INIT_TABLE[i].name);
  1478. GetAnalysePara(Fx->Para);      
  1479.     (*INIT_TABLE[i].CreateData)(Fx->MainData,Fx->RecCount,Fx->Data,Fx->Para);
  1480.     
  1481. Fx->CurRecPrt=Fx->RecCount-Fx->ShowDot;
  1482. if(Fx->CurRecPrt<0)
  1483. Fx->CurRecPrt=0;
  1484. Fx->PaintPara.IsScroll=FALSE;
  1485. if(Fx->RecCount>0) 
  1486. Fx->IsDataOk=TRUE;
  1487. else
  1488. Fx->IsDataOk=FALSE;
  1489. Fx->PaintPara.IsMax=FALSE;
  1490. Fx->PaintPara.IsAvLineShow=TRUE;
  1491. return TRUE;
  1492. }
  1493. int FxExit(LPFX Fx)
  1494. {
  1495.     int i;
  1496.      
  1497. if(Fx==0) return TRUE;
  1498.     if(Fx->MainData)
  1499.      _ffree(Fx->MainData);
  1500.     for(i=0;i<10;i++)
  1501.     {
  1502.      //unload object 1
  1503.      if(Fx->KxData.v[i]!=NULL)
  1504.      {   
  1505.      _ffree(Fx->KxData.v[i]);
  1506.      Fx->KxData.v[i]=NULL;
  1507.      }
  1508.      //unload object 2
  1509.      if(Fx->CjlData.v[i]!=NULL)
  1510.      {   
  1511.      _ffree(Fx->CjlData.v[i]);
  1512.      Fx->CjlData.v[i]=NULL;
  1513.      }
  1514.      //unload object 3
  1515.         if(Fx->Data->v==NULL) 
  1516.          continue;
  1517.      if(Fx->Data->v[i]!=NULL)
  1518.      {
  1519.      _ffree(Fx->Data->v[i]);
  1520.      Fx->Data->v[i]=NULL;
  1521.      }
  1522.     }    
  1523. if(Fx->PaintPara.hFont!=NULL)
  1524.      DeleteObject(Fx->PaintPara.hFont);
  1525.     
  1526.     if(Fx->Para)
  1527.      _ffree(Fx->Para);
  1528.     if(Fx->Data)
  1529.      _ffree(Fx->Data);
  1530. _ffree(Fx);
  1531.     
  1532.     _ffree(DIAGR_NAME);
  1533.     _ffree(INIT_TABLE);
  1534. Fx->IsDataOk=FALSE;
  1535. return  TRUE;
  1536. }
  1537. void FxFreeData(LPFX Fx)
  1538. {
  1539. int i;
  1540. if(Fx->MainData)
  1541. {
  1542.      _ffree(Fx->MainData);
  1543.      Fx->MainData=0;
  1544.     }
  1545.     
  1546.     for(i=0;i<10;i++)
  1547.     {
  1548.      //unload object 1
  1549.      if(Fx->KxData.v[i]!=NULL)
  1550.      {   
  1551.      _ffree(Fx->KxData.v[i]);
  1552.      Fx->KxData.v[i]=NULL;
  1553.      }
  1554.      //unload object 2
  1555.      if(Fx->CjlData.v[i]!=NULL)
  1556.      {   
  1557.      _ffree(Fx->CjlData.v[i]);
  1558.      Fx->CjlData.v[i]=NULL;
  1559.      }
  1560.      //unload object 3
  1561.         if(Fx->Data->v==NULL) 
  1562.          continue;
  1563.      if(Fx->Data->v[i]!=NULL)
  1564.      {
  1565.      _ffree(Fx->Data->v[i]);
  1566.      Fx->Data->v[i]=NULL;
  1567.      }
  1568.     }   
  1569. Fx->IsDataOk=FALSE;
  1570. Fx->ShowDot=0;
  1571. /*
  1572. BOOL CreateHistoryData(int range,char *gpdm)
  1573. {
  1574. char f1[80],f2[80];
  1575. OFSTRUCT os;
  1576. HFILE hf1,hf2;
  1577. GRA_HEAD GraHead;
  1578. GRA_DATA GraData;
  1579. DAY_DATA HistData,buff;
  1580. long ltim;
  1581. int i;
  1582. sprintf(f1,"%s\%s.dat",szDataPath,gpdm);
  1583. sprintf(f2,"%s\%s.%d",szDataPath,gpdm,MIN_5);
  1584. hf2 =OpenFile(f2,&os,OF_READWRITE|OF_SHARE_DENY_NONE);
  1585. if(hf2==HFILE_ERROR)
  1586. {
  1587. hf2 =OpenFile(f2,&os,OF_READWRITE|OF_SHARE_DENY_NONE|OF_CREATE);
  1588. if(hf2==HFILE_ERROR) return FALSE;
  1589. }
  1590. hf1 =OpenFile(f1,&os,OF_READ|OF_SHARE_DENY_NONE);
  1591. if(hf1!=HFILE_ERROR)
  1592. {
  1593. _lread(hf1,&GraHead,sizeof(GRA_HEAD));
  1594. _lseek(hf1,sizeof(GRA_HEAD)+sizeof(GRA_DATA)*(GraHead.minTotal-1),
  1595. SEEK_SET);
  1596. _lread(hf1,&GraData,sizeof(GRA_DATA));
  1597. if(filelength(hf2)>0)
  1598. {
  1599. _lseek(hf2,-1L*sizeof(DAY_DATA),SEEK_END);
  1600. _lread(hf2,&HistData,sizeof(DAY_DATA));
  1601. }
  1602. if(filelength(hf2)==0||HistData.day/1000<GraHead.dateNum)
  1603. {
  1604. memset(&HistData,0,sizeof(DAY_DATA));
  1605. _lseek(hf1,sizeof(GRA_HEAD),SEEK_SET);
  1606.   for(i=0;i<GraHead.minTotal;i++)
  1607.   {
  1608.  
  1609.   if(_lread(hf1,&GraData,sizeof(GRA_DATA))!=sizeof(GRA_DATA))
  1610.   break;
  1611.   if(GraData.tim ==0)
  1612.   continue;
  1613.   if(HistData.day !=0&&GraData.tim>=HistData.day%1000+5)
  1614.   {
  1615.   _lwrite(hf2,&HistData,sizeof(DAY_DATA));
  1616.   memset(&HistData,0,sizeof(DAY_DATA));
  1617.   }
  1618.   if(HistData.day ==0)  
  1619.   HistData.kpjg =GraData.zjjg +GraHead.zrsp;
  1620.   HistData.spjg =GraData.zjjg+GraHead.zrsp;
  1621.   if(HistData.day ==0)
  1622.   HistData.zgjg =HistData.zdjg =GraData.zjjg+GraHead.zrsp;
  1623.   else
  1624.   {
  1625.   if(HistData.zgjg<GraData.zjjg+GraHead.zrsp)
  1626.   HistData.zgjg=GraData.zjjg+GraHead.zrsp;
  1627.   if(HistData.zdjg>GraData.zjjg+GraHead.zrsp)
  1628.   HistData.zdjg=GraData.zjjg+GraHead.zrsp;
  1629.   }
  1630.   HistData.cjss +=GraData.lc;
  1631.   if(HistData.day ==0)
  1632.   HistData.day =(long)GraHead.dateNum*1000 +GraData.tim;
  1633.   }
  1634.   if(HistData.day!=0)
  1635.   _lwrite(hf2,&HistData,sizeof(DAY_DATA));  
  1636. }
  1637. else if(HistData.day/1000==GraHead.dateNum&&
  1638. GraData.tim>HistData.day%1000+5)
  1639. {
  1640. _lseek(hf1,sizeof(GRA_HEAD),SEEK_SET);
  1641. ltim =HistData.day%1000;
  1642. memset(&HistData,0,sizeof(DAY_DATA));
  1643.   for(i=0;i<GraHead.minTotal;i++)
  1644.   {
  1645.   if(_lread(hf1,&GraData,sizeof(GRA_DATA))!=sizeof(GRA_DATA))
  1646.   break;
  1647.   if(GraData.tim ==0)
  1648.   continue;
  1649.   if(ltim>=GraData.tim)
  1650.   continue;
  1651.   if(HistData.day !=0&&GraData.tim>=HistData.day%1000+5)
  1652.   {
  1653.   _lwrite(hf2,&HistData,sizeof(DAY_DATA));
  1654.   memset(&HistData,0,sizeof(DAY_DATA));
  1655.   }  
  1656.   if(HistData.day ==0)
  1657.   HistData.kpjg =GraData.zjjg+GraHead.zrsp;
  1658.   HistData.spjg =GraData.zjjg+GraHead.zrsp;
  1659.   if(HistData.day ==0)
  1660.   HistData.zgjg =HistData.zdjg =GraData.zjjg+GraHead.zrsp;
  1661.   else
  1662.   {
  1663.   if(HistData.zgjg<GraData.zjjg+GraHead.zrsp)
  1664.   HistData.zgjg=GraData.zjjg+GraHead.zrsp;
  1665.   if(HistData.zdjg>GraData.zjjg+GraHead.zrsp)
  1666.   HistData.zdjg=GraData.zjjg+GraHead.zrsp;
  1667.   }
  1668.   HistData.cjss +=GraData.lc;
  1669.   if(HistData.day ==0)
  1670.   HistData.day =(long)GraHead.dateNum*1000 +GraData.tim;
  1671.   }
  1672.   if(HistData.day !=0)
  1673.   _lwrite(hf2,&HistData,sizeof(DAY_DATA));  
  1674. }
  1675. _lclose(hf1);
  1676. }
  1677. if(range!=MIN_5)
  1678. {
  1679. sprintf(f1,"%s\%s.%d",szDataPath,gpdm,range);
  1680. hf1 =OpenFile(f1,&os,OF_WRITE|OF_SHARE_DENY_NONE|OF_CREATE);
  1681. if(hf1==HFILE_ERROR) return FALSE;
  1682. memset(&HistData,0,sizeof(DAY_DATA));
  1683. if(filelength(hf2)/sizeof(DAY_DATA)>MAXSHOWDOT)
  1684. _lseek(hf2,-1L*sizeof(DAY_DATA)*MAXSHOWDOT,SEEK_END);
  1685. else
  1686. _lseek(hf2,0L,SEEK_SET);
  1687. for(;;)
  1688. {
  1689.   if(_lread(hf2,&buff,sizeof(DAY_DATA))!=sizeof(DAY_DATA))
  1690.   break;
  1691.   if(HistData.day!=0&&buff.day%1000>=HistData.day%1000+atoi(RANGE_NAME[range]))
  1692.   {
  1693.   _lwrite(hf1,&HistData,sizeof(DAY_DATA));
  1694.   memset(&HistData,0,sizeof(DAY_DATA));  
  1695.   }
  1696.   if(HistData.day ==0) HistData.kpjg =buff.kpjg;
  1697.   HistData.spjg =buff.spjg;
  1698.   if(HistData.day ==0)
  1699.   {
  1700.   HistData.zgjg =buff.zgjg;
  1701.   HistData.zdjg =buff.zdjg;
  1702.   }
  1703.   else
  1704.   {
  1705.   if(HistData.zgjg<buff.zgjg)
  1706.   HistData.zgjg=buff.zgjg;
  1707.   if(HistData.zdjg>buff.zdjg)
  1708.   HistData.zdjg=buff.zdjg;
  1709.   }
  1710.   HistData.cjss +=buff.cjss;
  1711.   if(HistData.day ==0)
  1712.   HistData.day =buff.day;
  1713. }
  1714.  if(HistData.day !=0)
  1715.   _lwrite(hf1,&HistData,sizeof(DAY_DATA));
  1716. _lclose(hf1);
  1717. }
  1718. _lclose(hf2);
  1719. return TRUE;
  1720. */
  1721. BOOL CreateHistoryData(int range,char *gpdm)
  1722. {
  1723. char f1[80],f2[80];
  1724. OFSTRUCT os;
  1725. HFILE hf1,hf2;
  1726. GRA_HEAD GraHead;
  1727. GRA_DATA GraData;
  1728. DAY_DATA HistData,buff;
  1729. int i,am_start,am_end,jys,pm_start,pm_end;
  1730. int area_start,area_end;
  1731. jys =strlen(gpdm)==4?0:1;
  1732. am_start =HqTime[jys].am_min_start;
  1733. am_end =HqTime[jys].am_min_start+ HqTime[jys].am_min_count;
  1734. pm_start =HqTime[jys].pm_min_start;
  1735. pm_end =HqTime[jys].pm_min_start+ HqTime[jys].pm_min_count;
  1736. area_start =HqTime[jys].am_min_start;
  1737. area_end =area_start+5<=am_end?area_start+5:area_start+5+pm_start-am_end;
  1738. sprintf(f1,"%s\%s.dat",szDataPath,gpdm);
  1739. sprintf(f2,"%s\%s.%d",szDataPath,gpdm,MIN_5);
  1740. hf2 =OpenFile(f2,&os,OF_READWRITE|OF_SHARE_DENY_NONE|OF_CREATE);
  1741. if(hf2==HFILE_ERROR) return FALSE;
  1742. hf1 =OpenFile(f1,&os,OF_READ|OF_SHARE_DENY_NONE);
  1743. if(hf1!=HFILE_ERROR)
  1744. {
  1745. _lread(hf1,&GraHead,sizeof(GRA_HEAD));
  1746. _lread(hf1,&GraData,sizeof(GRA_DATA));
  1747. for(;;)
  1748. {
  1749. if(GraData.tim>area_end)
  1750. {
  1751. area_start =area_end;
  1752. area_end =area_start+5<=am_end?area_start+5:
  1753. area_start>pm_start?area_start+5:area_start+5+pm_start-am_end;
  1754. }
  1755. else break;
  1756. if(area_start>pm_end)
  1757. break;
  1758. }
  1759. if(area_start<=pm_end)
  1760. {
  1761. memset(&HistData,0,sizeof(DAY_DATA));
  1762. HistData.day =(long)GraHead.dateNum*1000 +area_start;
  1763. HistData.kpjg =GraData.zjjg +GraHead.zrsp;
  1764. HistData.zgjg =HistData.zdjg =GraData.zjjg+GraHead.zrsp;
  1765. _lseek(hf1,sizeof(GRA_HEAD),SEEK_SET);
  1766.   for(i=0;i<GraHead.minTotal;i++)
  1767.   {
  1768.  
  1769.   if(_lread(hf1,&GraData,sizeof(GRA_DATA))!=sizeof(GRA_DATA))
  1770.   break;
  1771.   if(GraData.tim ==0)
  1772.   continue;
  1773.  
  1774.   if(GraData.tim<area_end&&GraData.tim>=area_start)
  1775.   {
  1776.   HistData.spjg =GraData.zjjg+GraHead.zrsp;
  1777.  
  1778.   if(HistData.zgjg<GraData.zjjg+GraHead.zrsp)
  1779.   HistData.zgjg=GraData.zjjg+GraHead.zrsp;
  1780.   if(HistData.zdjg>GraData.zjjg+GraHead.zrsp)
  1781.   HistData.zdjg=GraData.zjjg+GraHead.zrsp;  
  1782.   HistData.cjss +=GraData.lc;  
  1783.   }
  1784.   else
  1785.   {
  1786.   //HistData.day =(long)GraHead.dateNum*1000 +area_end;
  1787.   _lwrite(hf2,&HistData,sizeof(DAY_DATA));
  1788.                     
  1789. area_start =area_end;
  1790. area_end =area_start+5<=am_end?area_start+5:
  1791. area_start>pm_start?area_start+5:area_start+5+pm_start-am_end;
  1792.                     
  1793. for(;;)
  1794. {
  1795. if(GraData.tim>area_end)
  1796. {
  1797. area_start =area_end;
  1798. area_end =area_start+5<=am_end?area_start+5:
  1799. area_start>pm_start?area_start+5:area_start+5+pm_start-am_end;
  1800. }
  1801. else break;
  1802. if(area_start>pm_end)
  1803. break;
  1804. }
  1805.  
  1806.   memset(&HistData,0,sizeof(DAY_DATA));   
  1807.  
  1808.   HistData.spjg =GraData.zjjg+GraHead.zrsp;  
  1809.   HistData.kpjg =GraData.zjjg +GraHead.zrsp;
  1810.   HistData.zgjg =HistData.zdjg =GraData.zjjg+GraHead.zrsp;
  1811.  
  1812.   HistData.cjss +=GraData.lc;  
  1813.   HistData.day =(long)GraHead.dateNum*1000 +area_start;  
  1814.   }
  1815.   }  
  1816.   if(HistData.day!=0)
  1817.   _lwrite(hf2,&HistData,sizeof(DAY_DATA));  
  1818. }
  1819. _lclose(hf1);
  1820. }
  1821. if(range!=MIN_5)
  1822. {
  1823. sprintf(f1,"%s\%s.%d",szDataPath,gpdm,range);
  1824. hf1 =OpenFile(f1,&os,OF_WRITE|OF_SHARE_DENY_NONE|OF_CREATE);
  1825. if(hf1==HFILE_ERROR) return FALSE;
  1826. memset(&HistData,0,sizeof(DAY_DATA));
  1827. if(filelength(hf2)/sizeof(DAY_DATA)>MAXSHOWDOT)
  1828. _lseek(hf2,-1L*sizeof(DAY_DATA)*MAXSHOWDOT,SEEK_END);
  1829. else
  1830. _lseek(hf2,0L,SEEK_SET);
  1831. for(;;)
  1832. {
  1833.   if(_lread(hf2,&buff,sizeof(DAY_DATA))!=sizeof(DAY_DATA))
  1834.   break;
  1835.   if(HistData.day!=0&&buff.day%1000>=HistData.day%1000+atoi(RANGE_NAME[range]))
  1836.   {
  1837.   _lwrite(hf1,&HistData,sizeof(DAY_DATA));
  1838.   memset(&HistData,0,sizeof(DAY_DATA));  
  1839.   }
  1840.   if(HistData.day ==0) HistData.kpjg =buff.kpjg;
  1841.   HistData.spjg =buff.spjg;
  1842.   if(HistData.day ==0)
  1843.   {
  1844.   HistData.zgjg =buff.zgjg;
  1845.   HistData.zdjg =buff.zdjg;
  1846.   }
  1847.   else
  1848.   {
  1849.   if(HistData.zgjg<buff.zgjg)
  1850.   HistData.zgjg=buff.zgjg;
  1851.   if(HistData.zdjg>buff.zdjg)
  1852.   HistData.zdjg=buff.zdjg;
  1853.   }
  1854.   HistData.cjss +=buff.cjss;
  1855.   if(HistData.day ==0)
  1856.   HistData.day =buff.day;
  1857. }
  1858.  if(HistData.day !=0)
  1859.   _lwrite(hf1,&HistData,sizeof(DAY_DATA));
  1860. _lclose(hf1);
  1861. }
  1862. _lclose(hf2);
  1863. return TRUE;
  1864. HBITMAP getImage(HDC hDC, LPRECT rc)
  1865. {
  1866. HBITMAP hBmp, hOldBmp;
  1867. HDC hdc =CreateCompatibleDC(hDC);
  1868. hBmp =CreateCompatibleBitmap(hDC, rc->right-rc->left, rc->bottom-rc->top);
  1869. hOldBmp =SelectObject(hdc, hBmp);
  1870. BitBlt(hdc, 0, 0, rc->right-rc->left, rc->bottom-rc->top, hDC, rc->left, rc->top, SRCCOPY);
  1871. SelectObject(hdc, hOldBmp);
  1872. DeleteObject(hdc);
  1873. return hBmp;
  1874. }
  1875. int putImage(HDC hDC, HBITMAP hBmp, LPRECT rc)
  1876. {
  1877. HDC hdc =CreateCompatibleDC(hDC);
  1878. SelectObject(hdc, hBmp);
  1879. BitBlt(hDC, rc->left, rc->top, rc->right-rc->left, rc->bottom-rc->top, hdc, 0, 0, SRCCOPY);
  1880. DeleteObject(hdc);
  1881. return hBmp;
  1882. }
  1883. int DrawScroll(LPFX Fx,int orient)
  1884. {
  1885. HDC hDc;
  1886. static int pos,recnum;
  1887. char tmp[100];
  1888. int i,j,htitle,wleft,repl,num,gap,tune,ltitle;
  1889. DATA *lpData;
  1890. PARA *lpPara;
  1891. if(Fx->KxData.v==NULL) return TRUE;
  1892. if(Fx->PaintPara.IsPainting) return TRUE;
  1893.     if(!Fx->PaintPara.IsScroll&&orient==SCROLL_CANCEL)
  1894.      return TRUE;
  1895. lpData =&Fx->KxData;
  1896. lpPara =&Fx->KxPara;
  1897. hDc =GetDC(ghWndFx);
  1898. SetBkColor(hDc,RGB(0,0,0));
  1899. SelectObject(hDc,Fx->PaintPara.hFont);
  1900. SetROP2(hDc, R2_NOT);
  1901. tune =FRAME_WIDTH;
  1902.     do
  1903.     {   
  1904.      if(lpPara->rc.bottom==0)
  1905.      {
  1906.          lpData =lpData->next;
  1907.      lpPara =lpPara->next;
  1908.      continue;
  1909.         }
  1910.         repl =pos;
  1911.         num =recnum;
  1912.         htitle =lpPara->htitle+tune;
  1913.         gap =(int)((lpPara->fwdt*80/100)/2)+tune;
  1914.         wleft =Fx->PaintPara.wleft+gap;
  1915.      if(!Fx->PaintPara.IsScroll) 
  1916.      {
  1917.      if(orient==SCROLL_LEFT||orient==SCROLL_END)
  1918.      {    
  1919.      repl=Fx->ShowDot;  //pos:1->show
  1920.      num=Fx->CurRecPrt+Fx->ShowDot-1; //num:prt ->prt +show -1
  1921.      }
  1922.      if(orient==SCROLL_RIGHT||orient==SCROLL_HOME)
  1923.      {
  1924.      repl=1;
  1925.      num=Fx->CurRecPrt;    
  1926.      }
  1927.      MoveTo(hDc,(int)(repl*lpPara->fwdt)+wleft,lpPara->rc.top+htitle+1);
  1928.      LineTo(hDc,(int)(repl*lpPara->fwdt)+wleft,lpPara->rc.bottom-1);
  1929.      }
  1930.      else
  1931.      {
  1932.      if(orient==SCROLL_RIGHT)
  1933.      {   
  1934.      //右移
  1935.        if(++repl>Fx->ShowDot) 
  1936.        {
  1937.           if(Fx->CurRecPrt<Fx->RecCount-1-Fx->ShowDot)
  1938.           {                                   //右换页
  1939. SetTimer(ghWndFx, 1, 500, NULL); 
  1940. Fx->PaintPara.IsPainting=TRUE;
  1941.      Fx->CurRecPrt=Fx->CurRecPrt+Fx->ShowDot*2<Fx->RecCount-1 
  1942.      ? Fx->CurRecPrt+Fx->ShowDot:Fx->RecCount-Fx->ShowDot;
  1943. Fx->PaintPara.IsScroll=FALSE;
  1944. if(Fx->PaintPara.IsUpDown)
  1945.              UpDown(Fx,0);             
  1946. InvalidateRect(ghWndFx, NULL, FALSE);
  1947. Fx->PaintPara.IsScroll=FALSE;
  1948. ReleaseDC(ghWndFx, hDc);
  1949. return 0;
  1950. }
  1951. else
  1952. {
  1953. repl=Fx->ShowDot;                //换页到顶
  1954. num =Fx->CurRecPrt+Fx->ShowDot-1;
  1955. }
  1956.        }                                     
  1957.        else
  1958.        {                                       
  1959.        repl--;                              //移线 
  1960.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);
  1961.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  1962.        if(++num>Fx->RecCount)
  1963.        num=Fx->RecCount;
  1964.        repl++;
  1965.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);
  1966.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  1967.        }      
  1968.      }
  1969.          if(orient==SCROLL_LEFT)
  1970.      {  
  1971.      //左移
  1972.      repl--;
  1973.      if(repl<1)
  1974.      {
  1975.           if(Fx->CurRecPrt>0)
  1976.           {                    //左换页
  1977. SetTimer(ghWndFx, 1, 500, NULL); 
  1978. Fx->PaintPara.IsPainting=TRUE;        
  1979.      Fx->CurRecPrt=Fx->CurRecPrt-Fx->ShowDot>=0 ? Fx->CurRecPrt-=Fx->ShowDot:0;
  1980. Fx->PaintPara.IsScroll=FALSE; 
  1981. if(Fx->PaintPara.IsUpDown)
  1982.              UpDown(Fx,0);
  1983. InvalidateRect(ghWndFx, NULL, FALSE);
  1984. Fx->PaintPara.IsScroll=FALSE;
  1985. ReleaseDC(ghWndFx, hDc);
  1986. return 0;
  1987. }
  1988. else
  1989. {
  1990. repl=1;          //换页到底
  1991. num =0;
  1992. }
  1993.      }
  1994.      else
  1995.      {   
  1996.      repl++;               //移线    
  1997.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);    
  1998.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  1999.      repl--;
  2000.        num--;
  2001.        if(recnum<0) num=0; 
  2002.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);
  2003.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  2004.      }
  2005.      }
  2006.      //按[END]键
  2007.      if(orient==SCROLL_END)
  2008.      {
  2009.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);    
  2010.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  2011.      repl=Fx->ShowDot;
  2012.      num=Fx->CurRecPrt+Fx->ShowDot-1;
  2013.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);    
  2014.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  2015.      }
  2016.      //按[HOME]键
  2017.      if(orient==SCROLL_HOME)
  2018.      {
  2019.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);
  2020.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  2021.      repl=1;
  2022.      num=Fx->CurRecPrt;
  2023.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);
  2024.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  2025.      }    
  2026.      //结束SCROLL 
  2027. if(orient==SCROLL_CANCEL)
  2028. {
  2029.      MoveTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.top+htitle+1);
  2030.      LineTo(hDc,(int)(repl*lpPara->fwdt) +wleft,lpPara->rc.bottom-1);
  2031.      }        
  2032.      }
  2033.      lpData =lpData->next;
  2034.      lpPara =lpPara->next;
  2035.     }while(lpData!=NULL&&lpPara!=NULL);
  2036.     pos =repl;
  2037.     recnum =num;
  2038.     SetTextColor(hDc,RGB(0,255,255));
  2039.     SetROP2(hDc, R2_COPYPEN);
  2040.     SetTextAlign(hDc, TA_LEFT|TA_TOP);    
  2041.     if(orient==SCROLL_CANCEL)
  2042.     {   
  2043. Fx->PaintPara.IsScroll=FALSE;
  2044. Msg("",MSG_HIDE);
  2045. ReleaseDC(ghWndFx, hDc);
  2046. return 0;
  2047.     }
  2048.     else
  2049.     {       
  2050.         i=(int)(Fx->PaintPara.rc.right/2)+5;
  2051.         Fx->MainData[recnum].date[8] =0;
  2052.     sprintf(tmp, "开:%5.2f收:%5.2f成交:%6ld",
  2053.     Fx->MainData[recnum].ks, Fx->MainData[recnum].ss,
  2054. Fx->MainData[recnum].cj);
  2055.     sprintf(tmp, "%s高:%5.2f低:%5.2f日期:%8s",tmp,
  2056.     Fx->MainData[recnum].zg, Fx->MainData[recnum].zd,
  2057.     Fx->MainData[recnum].date);
  2058.     Msg(tmp,MSG_VERT|MSG_TIME);
  2059.     }
  2060.     Fx->PaintPara.IsScroll=TRUE;
  2061.     SetBkColor(hDc,RGB(0,0,0));
  2062.     SetTextAlign(hDc, TA_LEFT|TA_TOP);   
  2063.     lpData =&Fx->KxData;
  2064.     lpPara =&Fx->KxPara;
  2065.    
  2066.     do
  2067.     {   
  2068.     ltitle =(lpPara->xtitle[1]-lpPara->xtitle[0])/2;
  2069.     htitle =lpPara->htitle;
  2070.      for(i=0,j=0;i<10&&lpPara->rc.bottom>0;i++)
  2071.      {
  2072.      if(lpPara->color[i]==0)
  2073.      continue;
  2074.      if(strlen(lpPara->pname[i])==0)
  2075.      continue;
  2076.      if(lpData->method[0]==VOULMN_BAR_METHOD)
  2077.          sprintf(tmp,"%.0f",lpData->v[i][recnum]);
  2078.      else
  2079.      sprintf(tmp,"%.2f",lpData->v[i][recnum]);
  2080.      SelectObject(hDc,GetStockObject(BLACK_BRUSH));
  2081.      SetBkMode(hDc, OPAQUE);
  2082.      Rectangle(hDc,lpPara->xtitle[j],lpPara->rc.top+4,
  2083.        lpPara->xtitle[j]+ltitle,lpPara->rc.top+htitle);
  2084.          //SetBkMode(hDc, TRANSPARENT);
  2085.      SetTextColor(hDc,lpPara->color[i]);
  2086.      TextOut(hDc,lpPara->xtitle[j],lpPara->rc.top+4,tmp,strlen(tmp));
  2087.      j++;
  2088.      }
  2089.      lpData =lpData->next;
  2090.      lpPara =lpPara->next;
  2091.     }while(lpData!=NULL&&lpPara!=NULL);
  2092. ReleaseDC(ghWndFx, hDc);
  2093. return TRUE;
  2094. }
  2095. int UpDown(LPFX Fx,int orient)
  2096. {    
  2097. HDC hDc;
  2098. static int pos;
  2099. static double start,step;
  2100. HPEN hPen;
  2101. char temp[10];
  2102. int chars,wleft,htitle;
  2103. static HBITMAP hBmp =NULL;
  2104. static RECT rc;
  2105.     DATA *lpData;
  2106.     PARA *lpPara;
  2107.     if(orient==0&&!Fx->PaintPara.IsUpDown)
  2108.      return TRUE;
  2109.     lpData =FindOpData();
  2110.     lpPara =FindOpPara();
  2111.     if(lpData==NULL||lpPara==NULL)
  2112.     {
  2113.      lpData =&Fx->KxData;
  2114.      lpPara =&Fx->KxPara;    
  2115.     }
  2116.     
  2117. hDc =GetDC(ghWndFx);
  2118. SelectObject(hDc,Fx->PaintPara.hFont);
  2119. SetROP2(hDc, R2_NOT);
  2120.     SetTextAlign(hDc, TA_RIGHT|TA_TOP);
  2121.     SetBkColor(hDc,RGB(255,255,255));
  2122.     SetTextColor(hDc,RGB(255,0,0));
  2123.     hPen=CreatePen(PS_SOLID,1,RGB(200,0,0));
  2124.     SelectObject(hDc,hPen);
  2125.     
  2126.     SetRect(&lpPara->rc,lpPara->rc.left,lpPara->rc.top+FRAME_WIDTH,
  2127.             lpPara->rc.right,lpPara->rc.bottom-FRAME_WIDTH);
  2128.                     
  2129.     htitle =lpPara->htitle;
  2130.     wleft =Fx->PaintPara.wleft;
  2131. SetViewportOrg(hDc, lpPara->rc.left+wleft,
  2132. (int)(lpPara->price[0]*lpPara->fhdj)+lpPara->rc.top+htitle);
  2133.     if(!Fx->PaintPara.IsUpDown)
  2134.     {   
  2135.      Fx->PaintPara.IsUpDown=TRUE;    
  2136.      start=lpPara->price[1];
  2137.      step=(lpPara->price[0]-lpPara->price[1])/60;
  2138.      pos=-(int)(start*lpPara->fhdj);
  2139.      MoveTo(hDc,lpPara->rc.left,pos);
  2140.      LineTo(hDc,lpPara->rc.right,pos);
  2141.      sprintf(temp,"%7.2f",start);
  2142.      chars=LOWORD(GetTextExtent(hDc,temp,strlen(temp)));
  2143. rc.left =lpPara->rc.left-chars;
  2144. rc.top =pos;
  2145. rc.right =rc.left +60;
  2146. rc.bottom =rc.top +13;
  2147. hBmp =getImage(hDc, &rc);
  2148.      TextOut(hDc, rc.left+chars, rc.top, temp, strlen(temp));
  2149.     }
  2150.     else    
  2151.     {
  2152.      if(orient!=0)
  2153.      {    
  2154.     putImage(hDc, hBmp, &rc);
  2155.      DeleteObject(hBmp);
  2156.      MoveTo(hDc,lpPara->rc.left,pos);
  2157.      LineTo(hDc,lpPara->rc.right,pos);
  2158.      if(lpData->method[0]==VOULMN_BAR_METHOD)
  2159.      sprintf(temp,"%7.0f",start);
  2160.      else
  2161.      sprintf(temp,"%7.2f",start);
  2162.     
  2163. start+=orient*step;
  2164. if(start>=lpPara->price[0]||start<lpPara->price[1])
  2165. start-=orient*step;
  2166.      pos=-(int)(start*lpPara->fhdj);    
  2167.     
  2168.      MoveTo(hDc,lpPara->rc.left,pos);
  2169.      LineTo(hDc,lpPara->rc.right,pos);
  2170.      if(lpData->method[0]==VOULMN_BAR_METHOD)
  2171.      sprintf(temp,"%7.0f",start);
  2172.      else
  2173.      sprintf(temp,"%7.2f",start);
  2174.      chars=LOWORD(GetTextExtent(hDc,temp,strlen(temp)));    
  2175. rc.left =lpPara->rc.left-chars;
  2176. rc.top =pos;
  2177. rc.right =rc.left +60;
  2178. rc.bottom =rc.top +13;
  2179. hBmp =getImage(hDc, &rc);
  2180.      TextOut(hDc, rc.left+chars, rc.top, temp, strlen(temp));
  2181.      }
  2182.      else
  2183.      {
  2184.      putImage(hDc, hBmp, &rc);
  2185.      DeleteObject(hBmp);
  2186.      Fx->PaintPara.IsUpDown=FALSE;
  2187.      MoveTo(hDc,lpPara->rc.left,pos);
  2188.      LineTo(hDc,lpPara->rc.right,pos);
  2189.      if(lpData->method[0]==VOULMN_BAR_METHOD)
  2190.      sprintf(temp,"%7.0f",start);
  2191.      else
  2192.      sprintf(temp,"%7.2f",start);
  2193.      pos=-(int)(lpPara->price[1]*lpPara->fhdj);
  2194.      }
  2195.     }
  2196.     SelectObject(hDc, GetStockObject(WHITE_PEN));
  2197.     DeleteObject(hPen);
  2198. ReleaseDC(ghWndFx, hDc);
  2199.     SetRect(&lpPara->rc,lpPara->rc.left,lpPara->rc.top-FRAME_WIDTH,
  2200.             lpPara->rc.right,lpPara->rc.bottom+FRAME_WIDTH);
  2201. return TRUE;
  2202. }